0

ウェブサイトからhtmlソースをダウンロードしてTextViewに表示する作業をしています。別のスレッドでダウンロード中なので、完了したら表示したいです。そう。終了するまでメインスレッドを一時停止する必要があります。今、私はこのようにしています:

    MyAsyncTask task = new MyAsyncTask(this);
    task.execute();
    Thread.sleep(6000);
    ((TextView) findViewById(R.id.textView1)).setText(task.result);

しかし、ご覧のとおり、これは最善の方法ではありません。「sleepUntil(boolean is MyTaskCompleted)」のようなものが必要です。Javaにはこのようなものがありますか。または、それを行うより良い方法はありますか?

4

4 に答える 4

1

コールバックを使用します。

MyCallback.java

public interface MyCallback<T> {
    public void onComplete(T result);
}

MyAsyncTask.java

public class MyAsyncTask extends AsyncTask<Void, Void, Boolean> {

    private MyCallback<Boolean> mCallback;

    public MyAsyncTask(MyCallback<Boolean> callback) {
        mCallback = callback;
    }

    @Override
    protected void onProgressUpdate(Void... progress) {
        super.onProgressUpdate(progress);
        // ...
    }

    @Override
    protected Boolean doInBackground(Void... params) {
        // ...
    }

    @Override
    protected void onPostExecute(Boolean result) {
        if (mCallback != null) {
            mCallback.onComplete(result); // will call onComplete() on MyActivity once the job is done
        }
    }

}

この例では、このコールバックは引数として何も受け取らず、を返しますBoolean

今、あなたがしなければならないのは、あなたの呼び出しクラス(MyActivity例えば)に実装させることMyCallbackです:

public class MyActivity extends Activity implements MyCallback<Boolean> {
    // ...

    xxx {
        MyAsyncTask myAsyncTask = new MyAsyncTask(this); // the callback
        myAsyncTask.execute();
    }

    // ...

    @Override
    protected void onComplete(Boolean result) {
        // ...
    }
}

これは私がしていることであり、非常にうまく機能します。

于 2012-08-21T14:23:13.047 に答える
1

UI スレッドをスリープ状態にすることは、UI スレッド自体で実際の作業を実行することと同じです。どちらの場合も、応答しない UI になり、「アプリケーションが応答しません」というメッセージが表示される可能性があります。

この作業が実行されている間、ユーザーが他のアクションを実行できないようにすることが目標のようです。これを行う別の方法の 1 つは、進行状況ダイアログで UI をブロックし、dismiss()そのダイアログをサブクラスのonPostExecute()メソッドでブロックすることです。AsyncTask

于 2012-08-21T14:10:10.117 に答える
0
doSomeWork();
new MyAsyncTask().execute(url);

AsyncTask:

private class MyAsyncTask extends AsyncTask<URL, Void, Void> {
 protected void doInBackground(URL... urls) {
     downloadHtml(urls[0]); 
 }

 protected void onPostExecute(Long result) {
     continueWorkHere();
 }
}
于 2012-08-21T14:19:56.243 に答える
0

Asynctask を拡張するクラスを作成し、オーバーロード メソッドで作業を実行することをお勧めします。これにより、別のスレッドでタスクを実行し、結果が完了した後にコードを実行できるようになります。

http://developer.android.com/reference/android/os/AsyncTask.html

使用法の下の例を見てください。onPreExecute と onPostExecute のオーバーロードは UI スレッドで実行されるため、onPreExecute で進行状況ダイアログを表示し、onPostExecute を閉じるなどの操作を実行できます。

于 2012-08-21T14:10:44.517 に答える