我正在尝试运行许多AsyncTasks来在同一个WebView上执行loadData()。例如,我有3个内容包含3个内容:“One”,“Two”,“Three”和内容为“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");
}
}
}
答案 0 :(得分:1)
这里没什么可做的..只需添加此行task.execute(contents[i]);
在postExecute()
的{{1}}中,将内容[i]设为类变量。AsynTask
将此调用两次,因为您希望它执行“一个”和“两个”
答案 1 :(得分:1)
从Async Task类中删除private String result;
行。
答案 2 :(得分:1)
在onPostExecute()
中,您希望在某处“返回”您的结果。这就是说FooTask
需要一个放置结果的地方。一个可能的候选人将是某种方法FooTask
可以调用其调用者来放置结果。如果您这样做,请注意该方法必须是synchronized
,否则某些返回可能会丢失。
或者,您可以FooTask
Handler
向Message
发送Message
以显示结果。在这种情况下,您不需要同步任何内容,因为所有{{1}}都将被发送到主/ UI线程,后者将以串行方式处理它们。