无法在doInBackground()中使用侦听器

时间:2013-02-04 07:42:47

标签: android android-asynctask listener

在我的asyncTask doInBackground()方法中,我想通过祝酒来处理异常。但我无法这样做,这是我得到的例外。这是为什么? 附:我可以在onPreExecute()onPostExecute()中执行此操作。

02-04 09:43:45.190: E/AndroidRuntime(19308): FATAL EXCEPTION: AsyncTask #1
02-04 09:43:45.190: E/AndroidRuntime(19308): java.lang.RuntimeException: An error     occured while executing doInBackground()
02-04 09:43:45.190: E/AndroidRuntime(19308):    at android.os.AsyncTask$3.done(AsyncTask.java:278)
02-04 09:43:45.190: E/AndroidRuntime(19308):    at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
02-04 09:43:45.190: E/AndroidRuntime(19308):    at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
02-04 09:43:45.190: E/AndroidRuntime(19308):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
02-04 09:43:45.190: E/AndroidRuntime(19308):    at java.util.concurrent.FutureTask.run(FutureTask.java:137)
02-04 09:43:45.190: E/AndroidRuntime(19308):    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
02-04 09:43:45.190: E/AndroidRuntime(19308):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
02-04 09:43:45.190: E/AndroidRuntime(19308):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
02-04 09:43:45.190: E/AndroidRuntime(19308):    at java.lang.Thread.run(Thread.java:856)
02-04 09:43:45.190: E/AndroidRuntime(19308): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
02-04 09:43:45.190: E/AndroidRuntime(19308):    at android.os.Handler.<init>(Handler.java:121)
02-04 09:43:45.190: E/AndroidRuntime(19308):    at android.widget.Toast$TN.<init>(Toast.java:317)
02-04 09:43:45.190: E/AndroidRuntime(19308):    at android.widget.Toast.<init>(Toast.java:91)
02-04 09:43:45.190: E/AndroidRuntime(19308):    at android.widget.Toast.makeText(Toast.java:233)
02-04 09:43:45.190: E/AndroidRuntime(19308):    at com.xxx.MenuActivity$ImageCount.setView(MenuActivity.java:208)
02-04 09:43:45.190: E/AndroidRuntime(19308):    at com.xxx.StringAsyncRetriever.getData(StringAsyncRetriever.java:101)
02-04 09:43:45.190: E/AndroidRuntime(19308):    at com.xxx.StringAsyncRetriever.getData(StringAsyncRetriever.java:95)
02-04 09:43:45.190: E/AndroidRuntime(19308):    at com.xxx.StringAsyncRetriever.doInBackground(StringAsyncRetriever.java:44)
02-04 09:43:45.190: E/AndroidRuntime(19308):    at com.xxx.StringAsyncRetriever.doInBackground(StringAsyncRetriever.java:1)
02-04 09:43:45.190: E/AndroidRuntime(19308):    at android.os.AsyncTask$2.call(AsyncTask.java:264)
02-04 09:43:45.190: E/AndroidRuntime(19308):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)

2 个答案:

答案 0 :(得分:3)

您无法在doInBackground内进行ui操作,因此如果异常返回可以在onPostExecute中检查的值...基于此值显示您的吐司

答案 1 :(得分:0)

Nunu的答案是正确的。但是如果你想在doInBackground方法中处理异常并显示一些toast并继续catch子句或方法本身中的一些其他操作,你应该使用onProgressUpdate方法。它也可以在UI线程上运行,并且可以在doInBackground中多次调用。您需要publishProgress来执行对onProgressUpdate方法的调用。

在doInBackground完成后,只调用一次OnPostExecute。

以下是AsynchTask的文档: http://developer.android.com/reference/android/os/AsyncTask.html