0

我想运行许多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"); 
     } 
    } 
} 

回答

1

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

+0

它的工作原理但是如果FooTask不是内部类。我需要将'result'传递给FooTask,就像我的代码一样? – Emerald214

+0

然后让'result'成为'async task'的'static'成员。你的问题基本上是你用一个空字符串附加你的内容,使它成为静态的,它应该工作。 –

+0

...但使用静态是相当奇怪的。 :|不知道这是否是一种好的做法。 – Emerald214

1

没有什么太多的在这里做的..只是添加此行的AsynTaskpostExecute()task.execute(contents[i]); ,使内容[I]作为一个类变量.. task.execute(contents[i]);调用此两次,因为你想要它做的“一“和”two“

+0

不,我希望每个任务都将其内容附加到结果变量,然后立即将其加载到WebView上。即任务A追加'一个'结果,任务B追加'两个'结果,...顺序不重要。如果我误解了你的答案,请添加一些代码。 – Emerald214

+0

那就是我想说的..你可以在postExecute里面多次调用asyncTask ..它可能会用于你的目的.. – ngesh

1

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

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