我想運行許多AsyncTasks在同一個WebView上執行loadData()。例如,我有3個線程,包含3個內容:「One」,「Two」,「Three」和內容爲「abc」的WebView。 (如下面的代碼)多個AsyncTasks加載相同的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");
}
}
}
它的工作原理但是如果FooTask不是內部類。我需要將'result'傳遞給FooTask,就像我的代碼一樣? – Emerald214
然後讓'result'成爲'async task'的'static'成員。你的問題基本上是你用一個空字符串附加你的內容,使它成爲靜態的,它應該工作。 –
...但使用靜態是相當奇怪的。 :|不知道這是否是一種好的做法。 – Emerald214