2010-07-30 19 views
1

J'ai deux activités AsyncTask, dont la seule responsabilité est d'exécuter une tâche AsyncTask sur le thread de l'interface utilisateur. L'un d'entre eux fonctionne très bien, affiche progressBar et met à jour le message ProgressBar. C'est pour mon SearchActivity, qui est en fait une activité de recherche avec les métadonnées de recherche Google pour déclarer une activité de recherche. J'ai créé un clone de AsyncTask, et seulement changé le code doInBackground, et aussi clone le SearchActivity et l'ai appelé browseActivity.AsyncTask n'affiche pas onPreExecute

Je lance BrowseActivity pour le résultat dans une classe qui étend listView lorsqu'un élément est cliqué. Ce que je projetais d'arriver était que le code onPreExecute de l'AsyncTask affiche un ProgressBar comme SearchActivity, entre l'activité ListView, et ResultActivity que ListView va démarrer onActivityResult. Le code onPreExcute est en cours d'appel mais le ProgressBar n'est jamais affiché. (Je pensais que je l'ai couru sur le correctement thread d'interface utilisateur?)

Voici 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(); 

} 

Voici le CategoryActivity (étend ListActivity) activité où browseActivity commence:

@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; 
     } 
    } 

Répondre

1

Tout d'abord , vous ne peut pas exécuter un AsyncTask sur le thread principal/UI, c'est le point entier. Lorsque vous appelez browseTask.execute() son va appeler ses méthodes sur le thread approprié (principal vs fond), indépendamment de l'appel runOnUiThread(). En appelant runOnUiThread() tout ce que vous faites est d'enrouler le code qui le commence dans un autre Runnable. Je pense que ce n'est pas ce que vous voulez car après avoir appelé runOnUiThread() vous essayez d'obtenir le résultat de la tâche, qui n'a pas encore été exécutée. Le code dans onCreate() s'exécute sur le thread d'interface utilisateur, donc cela doit se terminer avant que quelque chose d'autre puisse s'exécuter, à savoir le onPreExecute() du AsyncTask.

Ce que vous devriez faire est de créer le AsyncTask et de mettre tout ce que vous avez actuellement après runOnUiThread() dans onPostExecute().