2010-07-30 4 views
1

У меня есть два действия AsyncTask, единственная ответственность которых заключается в выполнении AsyncTask в потоке пользовательского интерфейса. Один из них отлично работает, отображает progressBar и обновляет сообщение ProgressBar. Это для моей SearchActivity, которая на самом деле является поисковой деятельностью с метаданными Google Search для объявления активности поиска. Я создал клон AsyncTask и только изменил код doInBackground, а также клонировал SearchActivity и назвал его browseActivity.AsyncTask не отображается onPreExecute

Я запускаю BrowseActivity для получения результата в классе, который расширяет listView при щелчке элемента. То, что я намеревался произойти, было для кода onPreExecute AsyncTask для отображения progressBar, как и в SearchActivity, между активностью ListView и ResultActivity, которые ListView запустит onActivityResult. Вызывается код onPreExcute, но ProgressBar никогда не отображается. (Я думал, что я запустил его в потоке пользовательского интерфейса правильно?)

Вот BrowseActivity:

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 (распространяется ListActivity) деятельность, где началась 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 в главном/пользовательском потоке, вот и все. Когда вы вызываете browseTask.execute(), он собирается вызвать его методы в соответствующем потоке (основной или фон), независимо от вызова runOnUiThread(). Вызывая runOnUiThread() все, что вы делаете, это обертывание кода, который запускает его в другом Runnable. Я думаю, это не то, что вы хотите, так как после вызова runOnUiThread() вы пытаетесь получить результат задачи, которая еще не запущена. Код в onCreate() работает в потоке пользовательского интерфейса, поэтому это должно завершиться до того, как что-то еще может быть выполнено, а именно onPreExecute()AsyncTask.

Что вы должны делать, так это создать AsyncTask и поместить все, что у вас есть, после runOnUiThread() в onPostExecute().

Смежные вопросы