Асинхронное обновление пользовательского интерфейса в Android

У меня есть вызов веб-службы, который вызывается каждые 10 секунд и должен обновлять TextView ответом веб-службы (или, по крайней мере, показывать всплывающее сообщение каждые 10 секунд)

Но интерфейс вообще не обновляется.

Пожалуйста, найдите код ниже.

public class MessagesRequestActivity extends Activity  {
    /** Called when the activity is first created. */
    String currentMsg="Default";
    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        //Calling the webservice
        getMessage();
    }
    public void getMessage(){

        try
        {
        SoapObject request = new SoapObject("http://tempuri.org/", "getMessage");

        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
        envelope.dotNet = true;
        envelope.setOutputSoapObject(request);

        //Web method call
        HttpTransportSE androidHttpTransport = new HttpTransportSE("http://192.168.4.50/WebService.asmx");
        androidHttpTransport.call("http://tempuri.org/"+ "getMessage", envelope);
        //get the response
        SoapPrimitive response = (SoapPrimitive)envelope.getResponse();

        //the response object can be retrieved by its name: result.getProperty("objectName");
        String message = (String)response.toString();
        Toast.makeText(this, message, Toast.LENGTH_LONG).show();

        }
        catch (Exception e)
        {
        e.printStackTrace();
        }
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        }
}

person Chandra Eskay    schedule 08.03.2013    source источник
comment
Используйте AsyncTask — developer.android.com/reference/android/os/AsyncTask.html   -  person Ronnie    schedule 08.03.2013
comment
Вы выполняете сетевую операцию в потоке пользовательского интерфейса, попробуйте использовать Asynctask или отдельный поток, и вы можете использовать обработчик, чтобы показать тост в рабочем потоке.   -  person Pragnani    schedule 08.03.2013
comment
Или используйте Context.runOnUiThread() для двух операторов обновления пользовательского интерфейса.   -  person Ronnie    schedule 08.03.2013
comment
@userSeven7s: у вас есть образец AsyncTask. Я не смог понять образец индикатора выполнения. Это сбивает с толку.   -  person Chandra Eskay    schedule 08.03.2013
comment
@Chandu-Indyaah Это просто .. Создайте «ProgressDialog» в onPreExecute и закройте в onPostExecute .. Просто погуглите .. вы найдете множество примеров .. это слишком распространено ..   -  person Ronnie    schedule 10.03.2013


Ответы (2)


Вот пример AsyncTask

public class TalkToServer extends AsyncTask<String, String, String> {
@Override
protected void onPreExecute() {
    super.onPreExecute();
}

@Override
protected void onProgressUpdate(String... values) {
    super.onProgressUpdate(values);

}

@Override
protected String doInBackground(String... params) {
//do your work here
    return something;
}

@Override
protected void onPostExecute(String result) {
    super.onPostExecute(result);
       // do something with data here-display it or send to mainactivity
}

Затем вы можете получить доступ, позвонив

TalksToServer varName = new TalkToServer(); //pass parameters if you need to the constructor
varName.execute();

Асинхронные документы Пример диалогового окна хода выполнения

Вы не хотите делать сетевые вещи или вызывать sleep в потоке UI. Если это внутренний класс, у вас будет доступ к вашим переменным-членам внешнего класса. В противном случае создайте конструктор в классе AsyncTask для передачи context, если вы хотите обновить с onPostExecute или другими методами, кроме doInBackground().

person codeMagic    schedule 08.03.2013
comment
Это выглядит нормально, но как мне повторно вызвать эту задачу из потока пользовательского интерфейса. - person Chandra Eskay; 08.03.2013
comment
Вам просто нужно создать новый Instance и снова вызвать execute(). Думаю, я не видел часть каждые 10 секунд. Вы можете использовать Handler, чтобы создать новый экземпляр и запустить его. - person codeMagic; 08.03.2013

Как уже упоминалось, вы делаете сетевые вызовы в потоке пользовательского интерфейса и выполняете Thread.Sleep(), который замораживает ваш пользовательский интерфейс.

Я бы попробовал что-то вроде этого класса AsyncHttpClient, в нем есть все необходимые вам функции, вам придется выполнять обновления пользовательского интерфейса в обратном вызове.

http://loopj.com/android-async-http/

person Badr Ghatasheh    schedule 08.03.2013