は私が私のdoInBackgroundのエラーを得続ける()doBackground AsyncTaskにエラーがありますか?
07-20 21:05:20.859: ERROR/AndroidRuntime(3289): java.lang.RuntimeException: An error occured while executing doInBackground()
07-20 21:05:20.859: ERROR/AndroidRuntime(3289): Caused by: android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
は、ここに私のasyncTask方法です。
private class MyTask extends AsyncTask<Void, Void, Void>{
@Override
protected Void doInBackground(Void... arg0) {try {
getImages();
Log.v("MyTask", "Image 1 retreived");
getImage2();
Log.v("MyTask", "Image 2 retreived");
getImage3();
Log.v("MyTask", "Image 3 retreived");
getImage4();
Log.v("MyTask", "Image 4 retreived");
} catch (IOException e) {
Log.e("MainMenu retreive image", "Image Retreival failed");
e.printStackTrace();
}
return null;
}
protected Void onPostExecute(){
((Gallery) findViewById(R.id.gallery))
.setAdapter(new ImageAdapter(MainMenu.this));
return null;
}
}
}
そして、それでも何らかの理由で私のUIを保持しています。 UIは完了した後に表示されません。
私のonCreate()は、ここで私はAsyncTaskを実行します。
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
MyTask myTask = new MyTask();
myTask.execute();
}
'AsyncTask'でさまざまなメソッドについて読む必要があります。あなたが書いたように、あなたはUIスレッド上であなたのイメージを取得し、別のスレッドであなたのアダプタを設定しようとしています(これが原因でエラーになっています)。 –
'onPostExecute()'は適切なメソッドをオーバーライドしていないので、 'AsyncTask'のインターフェースの一部ではないので、呼び出されません。指定したジェネリックは、onPostExecuteメソッドが 'AsyncTask'コントラクトを満たすためのパラメータとしてVoidオブジェクトを取ることを示唆しています。メソッドの宣言は 'onPostExecute(Void notUsed)'のようになります。これが '@Override'アノテーションが非常に役立つ理由です。 –
@Override protected void onPostExecute(Void notUsed){return; { – yoshi24