0

どういうわけか、AsyncTask が完了する前に GUI を使用できません。「onCreate」または「onCreateOptionsMenu」メソッドで execute() を投稿することの違いを認識しませんでした。何が悪いかわかりますか?助けてくれてありがとう。

package com.test11;

import java.util.concurrent.ExecutionException;

import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.MenuItem;
import android.support.v4.app.NavUtils;

public class TestActitivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test_actitivity);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_test_actitivity, menu);

        try
        {
            int t = new TestTask().execute().get();
        }

        catch (InterruptedException e)
        {
            e.printStackTrace();
        }

        catch (ExecutionException e)
        {
            e.printStackTrace();
        }

        return true;
    }

    class TestTask extends AsyncTask<Void, Void, Integer>
    {
        public Integer doInBackground(Void...voids)
        {
            try
            {
                Thread.sleep(10000);
            }

            catch(Exception e)
            {
                e.printStackTrace();
            }

            return 1;
        }
    }
}
4

2 に答える 2

2

次のようにタスクを実行します。

new TestTask().execute().get();

ここで正確に何をしますか?新しいタスクインスタンスを作成します。次に、それを実行します。get()次に、タスクを呼び出します。タスクは、このタスクの計算が完了するまで待機して、その値を返します。つまり、またははonCreate()2onCreateOptionsMenu()番目のスレッドが終了するまでブロックされます。を削除get()しても、タスクはUIをブロックしません。

結果を処理する場合はonPostExecute()、を使用する代わりにAsyncTaskをオーバーライドする必要がありますget()onPostExecute()UIスレッドで実行され、結果を使用してUIを簡単に操作できます。たとえば、結果をテキストビューで表示する場合は、次のような実装を使用します。

@Override
public void onPostExecute(Integer result) {
    TextView tv = (TextView) findViewById(R.id.sampletext);
    tv.setText("Result was " + result);
}
于 2012-07-11T08:43:38.940 に答える
0

のドキュメントを読むget:

必要に応じて計算が完了するまで待機し、その結果を取得します。

でそのメソッドを呼び出す必要はほとんどありませんAsyncTask。電話するだけexecuteです。

于 2012-07-11T08:40:46.963 に答える