1

私のasyncTask doInBackground()方法では、トーストを作成して例外を処理したいと思います。しかし、私はそうすることができません、そしてこれは私が得る例外です。何故ですか?PS私はそれを行うことができ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)
4

2 に答える 2

3

内部でUIアクションを実行することはできないため、doInBackground例外が発生した場合は、この値に基づいてチェックできる値を返し、onPostExecuteトーストを表示します。

于 2013-02-04T07:45:58.513 に答える
0

Nunuの答えは正しいです。ただし、doInBackgroundメソッドで例外を処理し、トーストを表示して、catch句またはメソッド自体で他の操作を続行する場合は、onProgressUpdateメソッドを使用する必要があります。UIスレッドでも実行され、doInBackground内で何度でも呼び出すことができます。onProgressUpdateメソッドの呼び出しを実行するには、publishProgressが必要です。

OnPostExecuteは、doInBackgroundが終了した後に1回だけ呼び出されます。

AsynchTaskのドキュメントは次のとおりです:http: //developer.android.com/reference/android/os/AsyncTask.html

于 2013-02-04T08:41:41.417 に答える