Android 无法在doInBackground()中使用侦听器
在我的Android 无法在doInBackground()中使用侦听器,android,android-asynctask,listener,Android,Android Asynctask,Listener,在我的asyncTaskdoInBackground()方法中,我想通过祝酒来处理异常。但我不能这样做,这是我得到的例外。为什么呢? 另外,我可以在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.RuntimeExcep
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)
02-04 09:43:45.190:E/AndroidRuntime(19308):致命异常:AsyncTask#1
02-04 09:43:45.190:E/AndroidRuntime(19308):java.lang.RuntimeException:执行doInBackground()时出错
02-04 09:43:45.190:E/AndroidRuntime(19308):在android.os.AsyncTask$3.done(AsyncTask.java:278)
02-04 09:43:45.190:E/AndroidRuntime(19308):位于java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
02-04 09:43:45.190:E/AndroidRuntime(19308):在java.util.concurrent.FutureTask.setException(FutureTask.java:124)
02-04 09:43:45.190:E/AndroidRuntime(19308):在java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
02-04 09:43:45.190:E/AndroidRuntime(19308):在java.util.concurrent.FutureTask.run(FutureTask.java:137)
02-04 09:43:45.190:E/AndroidRuntime(19308):在android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
02-04 09:43:45.190:E/AndroidRuntime(19308):位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
02-04 09:43:45.190:E/AndroidRuntime(19308):位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
02-04 09:43:45.190:E/AndroidRuntime(19308):在java.lang.Thread.run(Thread.java:856)中
02-04 09:43:45.190:E/AndroidRuntime(19308):原因:java.lang.RuntimeException:无法在未调用Looper.prepare()的线程内创建处理程序
02-04 09:43:45.190:E/AndroidRuntime(19308):在android.os.Handler.(Handler.java:121)
02-04 09:43:45.190:E/AndroidRuntime(19308):在android.widget.Toast$TN.(Toast.java:317)
02-04 09:43:45.190:E/AndroidRuntime(19308):在android.widget.Toast(Toast.java:91)
02-04 09:43:45.190:E/AndroidRuntime(19308):在android.widget.Toast.makeText(Toast.java:233)上
02-04 09:43:45.190:E/AndroidRuntime(19308):位于com.xxx.MenuActivity$ImageCount.setView(MenuActivity.java:208)
02-04 09:43:45.190:E/AndroidRuntime(19308):位于com.xxx.StringAsyncRetriever.getData(StringAsyncRetriever.java:101)
02-04 09:43:45.190:E/AndroidRuntime(19308):位于com.xxx.StringAsyncRetriever.getData(StringAsyncRetriever.java:95)
02-04 09:43:45.190:E/AndroidRuntime(19308):位于com.xxx.StringAsyncRetriever.doInBackground(StringAsyncRetriever.java:44)
02-04 09:43:45.190:E/AndroidRuntime(19308):位于com.xxx.StringAsyncRetriever.doInBackground(StringAsyncRetriever.java:1)
02-04 09:43:45.190:E/AndroidRuntime(19308):在android.os.AsyncTask$2.call(AsyncTask.java:264)
02-04 09:43:45.190:E/AndroidRuntime(19308):在java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
您不能在doInBackground
中执行ui操作,因此在出现异常的情况下,返回一个可在onPostExecute
中检查的值。。基于此值,显示您的祝酒词努努的回答是正确的。但是,如果您想在doInBackground方法中处理异常,并显示一些toast,并在catch子句或方法本身中继续执行一些其他操作,则应该使用onProgressUpdate方法。它也在UI线程上运行,可以在doInBackground中调用任意次数。您需要publishProgress来执行对onProgressUpdate方法的调用
在doInBackground完成后,OnPostExecute只被调用一次
以下是AsynchTask的文档: