2010-07-30 27 views
1

我有两个AsyncTask活动,其唯一的责任是在UI线程上执行一个AsyncTask。其中一个很好,显示progressBar,并更新ProgressBar消息。这是用于我的SearchActivity,它实际上是一个搜索活动,其中包含用于声明搜索活动的Google搜索元数据。我创建了AsyncTask的克隆,并且只更改了doInBackground代码,并且还克隆了SearchActivity并将其命名为browseActivity。AsyncTask在预执行时不显示

我开始BrowseActivity的结果在一个类扩展listView当一个项目被点击。我打算发生的事情是,AsyncTask的onPreExecute代码在ListView活动和ListView将启动onActivityResult的ResultActivity之间显示progressAar,如SearchActivity所做的那样。正在调用onPreExcute代码,但ProgressBar从不显示。 (我想我正确地运行了它在UI线程?)

这里是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

首先,你不能在主/ UI线程上运行一个AsyncTask,这就是整个问题。当你打电话给browseTask.execute()它将在适当的Thread(主vs背景)上调用它的方法,而不管调用runOnUiThread()。通过调用runOnUiThread(),您正在做的所有事情都是在另一个Runnable中包装启动它的代码。我想这不是你想要的,因为在调用runOnUiThread()之后,你尝试获得尚未运行的任务的结果。 onCreate()中的代码在UI线程上运行,因此必须先完成其他操作,即AsyncTaskonPreExecute()

你应该做的是创建AsyncTask并将runOnUiThread()之后的所有内容都放入onPostExecute()