동일한 WebView에서 loadData() 할 많은 AsyncTasks 실행하려고합니다. 예를 들어, "1", "2", "3"및 내용이 "abc"인 WebView가있는 3 개의 스레드가있는 스레드가 3 개 있습니다. (아래 코드와 같습니다)여러 AsyncTasks 동일한 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");
}
}
}
그것은 작동하지만, FooTask가 내부 클래스가 아니면 어떻게됩니까? 내 코드에서와 같이 FooTask에 '결과'를 전달해야합니까? – Emerald214
그런 다음'result'를'async task'의'정적'멤버로 만듭니다. 문제는 근본적으로 빈 문자열로 내용을 추가하고 정적으로 만들면 효과가 있습니다. –
... 정적을 사용하는 것은 아주 이상합니다. : | 그것이 좋은 연습인지 모른다. – Emerald214