2010-07-30 6 views
1

저는 UI 스레드에서 AsyncTask를 단독으로 실행하는 두 가지 AsyncTask 활동이 있습니다. 그 중 하나는 훌륭하게 작동하고 progressBar를 표시하며 ProgressBar 메시지를 업데이트합니다. 이것은 내 SearchActivity를위한 것으로 실제로 검색 활동을 선언하기위한 Google Search 메타 데이터가 포함 된 검색 활동입니다. AsyncTask의 복제본을 만들고 doInBackground 코드 만 변경하고 SearchActivity를 복제하여 browseActivity라고했습니다.AsyncTask가 onPreExecute를 표시하지 않습니다.

항목을 클릭하면 listView를 확장하는 클래스에서 결과를 찾아 BrowseActivity를 시작합니다. 내가 의도 한 것은 AsyncTask의 onPreExecute 코드가 SearchActivity가 ListView 액티비티와 ListView가 onActivityResult를 시작할 ResultActivity 사이에 progressBar를 표시하는 것이 었습니다. onPreExcute 코드가 호출되었지만 ProgressBar가 표시되지 않습니다. (내가 제대로 UI 스레드에서 그것을 실행 생각?)

여기

가 BrowseActivity입니다 : 첫째

@Override 
    protected void onListItemClick(ListView l, View v, final int position, long id) { 
     super.onListItemClick(l, v, position, id); 
     Intent i = new Intent(CategorySelectionView.this, BrowseActivity.class); 
     final Category[] categories = Category.values(); 
     i.putExtra(Category.BUNDLE_TAG, categories[position].putExtra()); 
     i.putExtra(Genre.BUNDLE_TAG, genre.putExtra()); 
     CategorySelectionView.this.startActivityForResult(i, BrowseActivity.RESULT_REQUEST_CODE); 
    } 

// Listen for results. 
    protected void onActivityResult(int requestCode, int resultCode, Intent data){ 
     // See which child activity is calling us back. 
     switch (requestCode) { 
      case BrowseActivity.RESULT_REQUEST_CODE: 
       // This is the standard resultCode that is sent back if the 
       // activity crashed or didn't doesn't supply an explicit result. 
       if (resultCode == RESULT_CANCELED){ 

       } 
       else { 
        ArrayList<SearchResult> recentQueryResults = (ArrayList<SearchResult>)data.getBundleExtra(
          BrowseActivity.BUNDLE_KEY).getSerializable(BrowseActivity.SERIALIZABLE_KEY); 
        GlobalVars.setRecentQueryResults(recentQueryResults); 
        Category category = Category.getCategoryFromExtra(data.getStringExtra(Category.BUNDLE_TAG)); 
        Intent i = new Intent(CategorySelectionView.this, RomListView.class); 
        i.putExtra(Category.BUNDLE_TAG, category.putExtra()); 
        i.putExtra(Genre.BUNDLE_TAG, genre.putExtra()); 
        startActivity(i); 
       } 
      default: 
       break; 
     } 
    } 

답변

1

: 여기

AsyncTask<String, String, ArrayList<SearchResult>> browseTask; 


/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    Intent intent = getIntent(); 
    String genreExtra = getIntent().getStringExtra(Genre.BUNDLE_TAG); 
     if(genreExtra!=null){ 
      genre = Genre.getgenreFromExtra(genreExtra); 
     } 

     String categoryExtra = getIntent().getStringExtra(Category.BUNDLE_TAG); 
     if(categoryExtra!=null){ 
      this.category = Category.getCategoryFromExtra(categoryExtra); 
     } 

     final Connector connector = GlobalVars.getCurrentConnector(); 

     Thread browseThread = new Thread(){ 

      @Override 
      public void run() { 
       try { 
        browseTask = connector.browse(BrowseActivity.this, category, genre, 1); 
        browseTask.execute(""); 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (ExecutionException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 

      }; 

      runOnUiThread(browseThread); 
      ArrayList<SearchResult> result = null; 

      try { 
       result = browseTask.get(); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (ExecutionException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

      Bundle queryBundle = new Bundle(); 
      queryBundle.putSerializable(SERIALIZABLE_KEY, result); 
      Intent i = new Intent(); 
      i.putExtra(BUNDLE_KEY, queryBundle); //Put in our browse results 
      i.putExtra(Category.BUNDLE_TAG, category.putExtra()); //put our category in return intent 
      i.putExtra(Genre.BUNDLE_TAG, genre.putExtra()); //put our genre in return intent 
      setResult(RESULT_OK, i); 
      finish(); 

} 

가 CategoryActivity browseActivity가 시작 활동 (ListActivity를 확장)입니다 , 주/UI 스레드에서 AsyncTask를 실행할 수 없다면 그게 전부입니다. browseTask.execute()을 호출하면 runOnUiThread()에 관계없이 해당 스레드 (주 대 배경)에서 해당 메서드를 호출합니다. runOnUiThread()을 호출하면 다른 코드로 시작하는 코드를 다시 포장합니다. Runnable. 나는 runOnUiThread()을 호출 한 후 당신이 아직까지 실행되지 않은 작업의 결과를 얻으려고하기 때문에 당신이 원하는 것이 아닌 것 같아요. onCreate()의 코드는 UI 스레드에서 실행되므로 다른 스레드를 실행하기 전에 끝내야합니다. 즉 onPreExecute()AsyncTask입니다.

당신이해야 할 일은 AsyncTask을 만들고 runOnUiThread() 다음에 현재 갖고있는 모든 것을 onPostExecute()에 넣는 것입니다.