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線程,這將對它們進行串行處理。