2011-07-20 18 views
0

は私が私の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(); 

} 
+0

'AsyncTask'でさまざまなメソッドについて読む必要があります。あなたが書いたように、あなたはUIスレッド上であなたのイメージを取得し、別のスレッドであなたのアダプタを設定しようとしています(これが原因でエラーになっています)。 –

+0

'onPostExecute()'は適切なメソッドをオーバーライドしていないので、 'AsyncTask'のインターフェースの一部ではないので、呼び出されません。指定したジェネリックは、onPostExecuteメソッドが 'AsyncTask'コントラクトを満たすためのパラメータとしてVoidオブジェクトを取ることを示唆しています。メソッドの宣言は 'onPostExecute(Void notUsed)'のようになります。これが '@Override'アノテーションが非常に役立つ理由です。 –

+0

@Override protected void onPostExecute(Void notUsed){return; { – yoshi24

答えて

0

あなたは実際にあなたのAsynkTaskですべてを移動したいと思うでしょう。ロードイメージ機能をバックグラウンドで行う方法に入れてから、setListAdapterコールでonPostExecuteメソッドを呼び出すと、Doinbackgroundメソッドはビューを変更または更新できませんが、onPostexecuteは可能になります。

protected void onPostExecute(Exception error) { 
     try { 
      if (error == null) { 
       ((Gallery) findViewById(R.id.gallery)) 
         .setAdapter(new ImageAdapter(MainMenu.this)); 

      } else 

      throw error; 
     } catch (Throwable t) { 

     } 
    } 
+0

これを 'try-catch'で囲むつもりはないと思います。 'throw error;'行は 'catch(Throwable t)'にキャッチされます。 –

+0

@jaredが私の更新されたAsyncTaskメソッドを見ます。 onPostExecuteが呼び出されることはありません。バックグラウンドでのdoだけ – yoshi24

1

UIスレッドを使用していない間は、UIを操作できません。

AsyncTask documentation

私は手足に出て行って、自分の時間がかかる通話がgetImages()であることを推測するつもりです。この場合、これらのメソッド呼び出しはdoInBackground()メソッドで発生し、現在doInBackground()メソッドにあるコードはonPostExecute()メソッドに移動する必要があります。

関連する問題