27

我有 AsyncTask 在后台完成的任务。在某些时候,我需要发出一个 Toast 来表示某事已完成。

我试过了,但我失败了,因为 Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

我怎样才能做到这一点?

4

6 回答 6

38

onPostExecute - 在 UI 线程上执行或 publishProgress();在你的背景和

protected void onProgressUpdate(Integer... progress) {
}

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

于 2010-05-14T21:40:12.647 回答
27

你可以在 doInBackground 里面 Toast

将此代码添加到您想要 Toast 出现的位置

runOnUiThread(new Runnable() {
public void run() {

    Toast.makeText(<your class name>.this, "Cool Ha?", Toast.LENGTH_SHORT).show();
    }
});
于 2013-04-07T18:18:24.297 回答
20

您还可以使用runOnUiThread方法从后台线程操作您的 UI。

于 2010-05-14T21:52:31.133 回答
9

如果你想使用 Toast 你应该使用这个方法:onProgressUpdate()

protected Integer doInBackground(Void...Params) {
   int check_point = 1;
   publishProgress(check_point);
   return check_point;
}

protected void onProgressUpdate(Integer integers) {
  if(integers == 1) {
    Toast.makeText(classname.this, "Text", 0).show(); 
}
于 2011-12-09T01:49:50.170 回答
1

如果要从后台线程显示 Toast,则必须从 doInBackground 调用 runOnUiThread。我不相信还有其他方法。

编辑:我收回了。我认为您可以实现在 UI 线程上运行的 onProgressUpdate,以显示 Toast 并从 doInBackground 调用 publishProgress。

于 2010-05-14T22:48:15.807 回答
1

如果要在 doInBackground 中显示 Toast,可以在 AsyncTask 的 OnPostExecute 方法中使用。

protected void onPostExecute(String file_url) {    
   Toast.makeText(getApplicationContext(),"Your Message", Toast.LENGTH_LONG).show();

   pDialog.dismiss();//dismiss the progress dialouge
}
于 2016-02-05T10:11:58.773 回答