2013-02-04 105 views
1

在我的asyncTaskdoInBackground()方法中,我想通過做一個敬酒來處理異常。但我無法這樣做,這是我得到的例外。這是爲什麼? P.S.我可以在onPreExecute()onPostExecute()中完成。無法在doInBackground()中使用監聽器

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) 

回答

3

你不能讓UI操作中doInBackground,所以在例外的情況下返回根據這個值可以在onPostExecute檢查值..顯示你的麪包

0

努努的答案是正確的。但是,如果你想在doInBackground方法中處理異常,並顯示一些吐司並繼續執行catch子句或方法本身中的其他操作,則應使用onProgressUpdate方法。它也可以在UI線程上運行,並且可以在doInBackground中隨意多次調用。您需要publishProgress來執行對onProgressUpdate方法的調用。

在doInBackground完成後,只會調用一次OnPostExecute。

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