Невозможно отобразить сообщение Toast при использовании с WebService - PullRequest
0 голосов
/ 18 мая 2011

Мне нужно отобразить сообщение пользователю "Связь с сервером ... Пожалуйста, подождите несколько секунд", когда сделан вызов веб-сервису. В настоящее время я использую Toast.makeText для отображения сообщения. По какой-то причине я не вижу всплывающее сообщение. Но что интересно, когда я комментирую вызов метода веб-сервиса, я вижу сообщение Toast.

Toast.makeText(this, "Communicating to the Server...Please wait for few seconds",      
                     Toast.LENGTH_SHORT).show();

//webservice code goes here...

Или любая другая альтернатива для удовлетворения этого требования тоже подойдет.

Ответы [ 4 ]

1 голос
/ 18 мая 2011

Вы смотрели на использование AysncTask .Используя AsyncTask, вы можете показать диалог с вашим сообщением на onPreExecute().

0 голосов
/ 18 мая 2011

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

запустите вызов веб-службы в потоке, используя AsyncTask, или просто создайте поток, как,

new Thread(new Runnable() {
  public void run() {
    // WS call here

  }
}).start();

позаботьтесь о том, чтобы при создании собственного потока вы могли обновлять пользовательский интерфейс только из потока пользовательского интерфейса, поэтому вам потребуется использовать Handler.post () или sendMessage () для запуска обновления пользовательского интерфейса в потоке пользовательского интерфейса.

http://developer.android.com/reference/android/os/AsyncTask.html http://developer.android.com/reference/android/os/Handler.html

0 голосов
/ 18 мая 2011

Вы можете использовать AsyncTask для запуска службы и показать Toast в onPreExecute.

Или вы можете использовать обычный Thread, но вам нужно будет использовать Handler. Вот как:

class MyActivity extends Activity
{
    final Handler mHandler;
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(...);
        mHandler = new Handler();

        ...
    }

    void showToast(final String text)
    {
        mHandler.post(new Runnable()
        {               
            @Override
            public void run()
            {
                Toast.makeText(MyActivity.this, text, Toast.LENGTH_LONG).show();
            }
         });
    }

    class MyThread implements Runnable
    {
        @Override
        public void run()
        {
            showToast("your custom text");
            //your service code
        }
    }           
}

А вот как вы начинаете тему:

Thread thread = new Thread(new MyThread());
thread.run();
0 голосов
/ 18 мая 2011

НЕ смешивайте код интерфейса пользователя и код сети.Смотри: http://developer.android.com/resources/articles/painless-threading.html

...