0

我正在尝试在同一个 WebView 上运行许多 AsyncTask 来执行 loadData()。例如,我有 3 个线程,包含 3 个内容:“一”、“二”、“三”和一个内容为“abc”的 WebView。(就像下面的代码)

完成 3 个任务后,我希望 WebView 有内容:“abcOneTwoThree”。这段代码的想法是三个线程随时将其内容附加到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

onPostExecute()你想在某个地方“返回”你的结果。这就是说FooTask需要一个地方来放置它的结果。可能的候选者是某种方法FooTask可以调用其调用者来放置结果。如果这样做,请注意方法必须是synchronized,否则可能会丢失一些返回。

或者,您可以给出FooTask一个Handler它可以将Message结果发送到的一个。在这种情况下,你不需要同步任何东西,因为所有的Messages 都将被发送到主/UI线程,主线程将串行处理它们。

于 2011-08-01T20:50:00.510 回答
1

这里没什么可做的.. 只需添加这一行并将task.execute(contents[i]); contents [i] 作为类变量..调用它两次,因为您希望它执行“一”和“二”postExecute()AsynTasktask.execute(contents[i]);

于 2011-08-01T10:24:53.160 回答
1

private String result;从 Async Task 类中删除该行。

于 2011-08-01T11:51:10.010 回答