Android 多个异步任务加载相同的WebView

Android 多个异步任务加载相同的WebView,android,multithreading,android-asynctask,android-1.6-donut,Android,Multithreading,Android Asynctask,Android 1.6 Donut,我试图在同一个WebView上运行许多AsyncTasks来执行loadData()。例如,我有3个包含3个内容的线程:“一”、“二”、“三”和一个包含“abc”内容的WebView。(如下面的代码) 完成3个任务后,我希望WebView有内容:“abcOneTwoThree”。这段代码的想法是,三个线程将随时将其内容附加到WebView,因此结果可能是“abcTwoOneThree”或“abctwothree”,等等 我读了很多关于并发性的文章,但仍然不明白如何实现它。这是我的密码。它只打印“

我试图在同一个WebView上运行许多AsyncTasks来执行loadData()。例如,我有3个包含3个内容的线程:“一”、“二”、“三”和一个包含“abc”内容的WebView。(如下面的代码)

完成3个任务后,我希望WebView有内容:“abcOneTwoThree”。这段代码的想法是,三个线程将随时将其内容附加到WebView,因此结果可能是“abcTwoOneThree”或“abctwothree”,等等

我读了很多关于并发性的文章,但仍然不明白如何实现它。这是我的密码。它只打印“abcThree”

使用SamewViewActivity的公共类扩展了活动实现OnClickListener{ 私人按钮1; 私有网络视图; 私有字符串结果; @凌驾 创建时的公共void(最终捆绑包savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); button1=(按钮)findViewById(R.id.button1); button1.setOnClickListener(此); webView=(webView)findViewById(R.id.webView1); 结果=“abc”; } @凌驾 公共void onClick(最终视图v){ 最后一个字符串[]contents={“一”、“二”、“三”}; 对于(int i=0;i<3;++i){ 最终提问任务=新提问(网络视图,结果); 任务执行(目录[i]); } } 私有类FootTask扩展了异步任务{ 私有最终网络视图结果视图; 私有字符串结果; //这就是我努力使它正常工作的原因。 私有同步字符串getResult(){ 返回结果; } 公共提问(最终WebView结果视图、最终字符串结果){ this.resultView=resultView; this.result=结果; } @凌驾 受保护字符串doInBackground(最终字符串…参数){ //随机执行长时间工作,然后返回一个字符串。 返回参数[0]; } @凌驾 受保护的void onPostExecute(最终字符串内容){ 结果=getResult()+内容; 加载数据(结果,“文本/html”、“utf-8”); } } }
这里没什么可做的。。只需添加此行
task.execute(contents[i])

AsynTask
postExecute()
中,将内容[i]作为类变量<代码>任务执行(目录[i])调用它两次,因为您希望它执行“一”和“二”

这里没有什么可做的。。只需添加此行
task.execute(contents[i])

AsynTask
postExecute()
中,将内容[i]作为类变量<代码>任务执行(目录[i])调用它两次,因为您希望它执行“一”和“二”

删除
私有字符串结果异步任务类中的行。

删除
私有字符串结果异步任务类的行。

onPostExecute()
中,您希望在某个地方“返回”结果。也就是说,
FooTask
需要一个地方来放置结果。一个可能的候选者是某种方法
FooTask
可以调用其调用者来放置结果。如果执行此操作,请注意该方法必须是同步的,否则可能会丢失一些返回

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

onPostExecute()
中,您希望在某个地方“返回”结果。也就是说,
FooTask
需要一个地方来放置结果。一个可能的候选者是某种方法
FooTask
可以调用其调用者来放置结果。如果执行此操作,请注意该方法必须是同步的,否则可能会丢失一些返回


或者,您可以给
FooTask
一个
Handler
,它可以将
消息
与结果一起发送给。在这种情况下,您将不需要同步任何内容,因为所有的
消息将被发送到主/UI线程,该线程将连续处理它们。

否,我希望每个任务将其内容附加到结果变量,然后立即将其加载到WebView上。i、 任务A在结果后面加上“一”,任务B在结果后面加上“二”。。。顺序并不重要。如果我误解了你的答案,请加上一些代码。这就是我想说的。。您可以在postExecute内多次调用asyncTask。。它可能会满足您的需要。不,我希望每个任务都将其内容附加到结果变量,然后立即将其加载到WebView上。i、 任务A在结果后面加上“一”,任务B在结果后面加上“二”。。。顺序并不重要。如果我误解了你的答案,请加上一些代码。这就是我想说的。。您可以在postExecute内多次调用asyncTask。。它可能会达到你的目的。它是有效的,但如果脚踏板不是阶级内部的呢。我需要像在我的代码中一样将“结果”传递给FooTask?然后使
result
a
static
成为
async任务的成员。您的问题本质上是,您正在用一个空字符串追加内容,将其设为静态,它应该可以工作。。。。但是使用静态是很奇怪的我不知道这是否是一个好的练习。它是有效的,但如果步法不是内在的职业呢。我需要像在我的代码中一样将“结果”传递给FooTask?然后使
result
a
static
成为
async任务的成员。您的问题本质上是,您正在用一个空字符串追加内容,将其设为静态,它应该可以工作。。。。但是使用静态是很奇怪的不知道这是否是一个好的做法。
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");
        }
    }
}