0

同じWebViewでloadData()を実行するために多くのAsyncTasksを実行しようとしています。たとえば、「One」、「Two」、「Three」の3つのコンテンツを持つ3つのスレッドと、「abc」というコンテンツを持つWebViewがあります。(以下のコードのように)

3つのタスクが完了したら、WebViewに「abcOneTwoThree」というコンテンツが必要です。このコードの考え方は、3つのスレッドがいつでもそのコンテンツをWebViewに追加するため、結果は「abcTwoOneThree」や「abcTwoThreeOne」などになる可能性があるということです...

私は多くの並行性の記事を読みましたが、それでもこれを実装する方法を理解していません。これは私のコードです。「abcThree」を出力するだけです。

public class UsingSameWebViewActivity extends Activity implements OnClickListener {
    private Button button1;
    private WebView webView;
    private String result;

    @Override
    public void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        button1 = (Button)findViewById(R.id.button1);
        button1.setOnClickListener(this);
        webView = (WebView)findViewById(R.id.webView1);
        result = "abc";
    }

    @Override
    public void onClick(final View v) {
        final String[] contents = {"One", "Two", "Three"};
        for(int i = 0; i < 3; ++i) {
            final FooTask task = new FooTask(webView, result);
            task.execute(contents[i]);
        }
    }

    private class FooTask extends AsyncTask<String, Void, String> {
        private final WebView resultView;
        private String result;

        // This is what I try to make it work right.
        private synchronized String getResult() {
            return result;
        }

        public FooTask(final WebView resultView, final String result) {
            this.resultView = resultView;
            this.result = result;
        }

        @Override
        protected String doInBackground(final String... params) {
        // Do a long time work randomly then returns a string.
            return params[0];
        }

        @Override
        protected void onPostExecute(final String content) {
            result = getResult() + content;
            resultView.loadData(result, "text/html", "utf-8");
        }
    }
}
4

3 に答える 3

1

ここでは何もする必要はありません。この行task.execute(contents[i]); をにpostExecute()追加しAsynTask、contents [i]をクラス変数として作成します。task.execute(contents[i]);「1」と「2」を実行するため、これを2回呼び出します。

于 2011-08-01T10:24:53.160 に答える
1

private String result;非同期タスククラスから行を削除します。

于 2011-08-01T11:51:10.010 に答える
1

あなたはonPostExecute()どこかにあなたの結果を「返したい」のです。これは、FooTaskその結果を出す場所が必要だということです。FooTask可能性のある候補は、結果を配置するために呼び出し元を呼び出すことができるある種のメソッドです。これを行う場合、メソッドはでなければならないことに注意してくださいsynchronized。そうしないと、一部の返品が失われる可能性があります。

または、結果とともに送信できるを指定することもできFooTaskます。この場合、すべてのがシリアルに処理されるメイン/ UIスレッドに送信されるため、何も同期する必要はありません。HandlerMessageMessage

于 2011-08-01T20:50:00.510 に答える