在异步背景中显示“Toast”的好方法

时间:2014-06-12 21:41:41

标签: android android-networking retrofit

建立连接时,有时可能会发生错误或wifi可能会关闭。因此,在这些情况下,我想向用户显示Toast消息。

所以我尝试过这样的事情:

protected String doInBackground (String ... args) {
    QircAccount account = new MyAccount(getApplicationContext());
    try {
        acceptable = MyManager.INSTANCE.getService().getAcceptable(account.getUsername(), account.getAuthToken(), recId);
    }
    catch (RetrofitError re) {
        Response r = re.getResponse();
        if (r!=null && r.getStatus() == 403) {
            isLoggedIn = false;
        }
        if (re.isNetworkError()) {
            Toast.makeText(getBaseContext(), "Connectivity problem.", Toast.LENGTH_SHORT).show();
        }
    }

但这会产生如下错误:

Can't create handler inside thread that has not called Looper.prepare()

问题

  • 所以最好在onPostExecute显示Toast消息?
  • 我应该如何传递消息"连接问题"到onPostExecute

2 个答案:

答案 0 :(得分:1)

嗯,你总是可以做到

runOnUiThread(new Runnable() {
    public void run() {
       Toast.makeText(.....).show();
    }
});

答案 1 :(得分:0)

So its best to show Toast message in onPostExecute?

是的,因为onPostExecute在UI线程中运行。

永远不要在另一个线程中调用Toast.makeText,只有创建它的线程才会是唯一可以调用/更新它的线程。因此,您仍然可以通过调用UI线程runOnUiThread来调用/更新其他线程。

How should I pass the message "connectivity problem" to onPostExecute?

只需将其作为字符串返回doInBackground,因为它以字符串形式返回。

if (re.isNetworkError()) {
        return "Connectivity problem.";
   }
onPostExecute

中的

    @Override
    protected void onPostExecute(String result) 
    {
      Toast.makeText(getBaseContext(), result, Toast.LENGTH_SHORT).show();
    }
相关问题