1

私は 2 つの AsyncTask アクティビティを持っています。その唯一の責任は、UI スレッドで AsyncTask を実行することです。それらの 1 つはうまく機能し、progressBar を表示し、ProgressBar メッセージを更新します。これは、実際には検索アクティビティを宣言するための Google 検索メタデータを使用した検索アクティビティである、私の SearchActivity 用です。AsyncTask のクローンを作成し、doInBackground コードのみを変更し、SearchActivity のクローンを作成して、browseActivity と呼びました。

項目がクリックされたときに listView を拡張するクラスで結果を得るために、BrowseActivity を開始します。私が意図したのは、AsyncTask の onPreExecute コードが SearchActivity と同じように、ListView アクティビティと、ListView が onActivityResult を開始する ResultActivity の間に、progressBar を表示することでした。onPreExcute コードが呼び出されていますが、ProgressBar は表示されません。(UIスレッドで正しく実行したと思いましたか?)

ブラウズ アクティビティは次のとおりです。

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

}

以下は、browseActivity が開始される CategoryActivity (ListActivity を拡張) アクティビティです。

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

1 に答える 1

1

まず、メイン/UIスレッドでAsyncTaskを実行することはできません。それが要点です。を呼び出すとbrowseTask.execute()、呼び出しに関係なく、適切なスレッド(メインとバックグラウンド)でメソッドを呼び出すことになりrunOnUiThread()ます。runOnUiThread()あなたがしているすべてを呼び出すことによって、それを開始するコードを別のでラップすることRunnableです。runOnUiThread()呼び出した後、まだ実行されていないタスクの結果を取得しようとするので、私はあなたが望むものではないと思います。のコードonCreate()はUIスレッドで実行されるため、他の何か、つまりのを実行する前に、これを終了する必要がonPreExecute()ありAsyncTaskます。

あなたがしなければならないことは、を作成し、AsyncTask現在持っているすべてのものをに入れることrunOnUiThread()ですonPostExecute()

于 2011-08-04T21:02:09.353 に答える