Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android在运行异步任务之间交换数据_Java_Android_Asynctaskloader - Fatal编程技术网

Java Android在运行异步任务之间交换数据

Java Android在运行异步任务之间交换数据,java,android,asynctaskloader,Java,Android,Asynctaskloader,我试图实现的是在运行asynctask(doInBackground)的服务器之间共享数据。 因此,我有一个单独的类(扩展了Asynctask),它用自己的异步类加载数据和活动,我用它来更新活动中的信息。基本上,我试图实现的是活动中的线程(监控线程)与加载器一起工作,并从加载器类提供一些数据,当加载器准备就绪时,“监控”和“加载器”都应该消失 我尝试使用接口设置一个可变变量,但没有成功,我似乎无法在线程之间共享信息(异步任务)。。有什么建议吗?也许需要一个交换类 有什么原因不能使用该功能吗?我可

我试图实现的是在运行asynctask(doInBackground)的服务器之间共享数据。 因此,我有一个单独的类(扩展了Asynctask),它用自己的异步类加载数据和活动,我用它来更新活动中的信息。基本上,我试图实现的是活动中的线程(监控线程)与加载器一起工作,并从加载器类提供一些数据,当加载器准备就绪时,“监控”和“加载器”都应该消失


我尝试使用接口设置一个可变变量,但没有成功,我似乎无法在线程之间共享信息(异步任务)。。有什么建议吗?也许需要一个交换类

有什么原因不能使用该功能吗?我可能被你的用例弄糊涂了。。。但下面可能是一个例子:

class MyActivity extends Activity {

  private AsyncTask<Uri,MyDataObject, MyResult> = new AsyncTask<Uri,MyDataObject, MyResult>() {
    private MyResult mResult;

    protected MyResult doInBackground(Uri... uris) {           
      int count = urls.length;
      mResult = new MyResult()

      for (int i = 0; i < count; i++) {
        MyDataObject anObject = mDataLoader.getObject(uris[i]);
        publishProgress(anObject);

        mResult.add(anObject);
        // Escape early if cancel() is called
        if (isCancelled()) break;
      }
      return totalSize;
    }

    protected void onProgressUpdate(MyDataObject... data) {
      addDataToUI(data[0]);
    }

    protected void onPostExecute(MyResult result) {
      Toast.makeText("All Done!", Toast.LENGTH_LONG).show();
    }
  }
}
类MyActivity扩展活动{
private AsyncTask=new AsyncTask(){
私人MyResult;
受保护的MyResult doInBackground(Uri…Uri){
int count=url.length;
mResult=新的MyResult()
for(int i=0;i
听起来您想让活动在加载程序线程加载数据时显示一些信息?因此,您需要将一些信息从加载程序传递到活动中,以更新UI。在这种情况下,我不确定您是否需要在活动中使用第二个AsyncTask(以及关联的线程),因为您仍然需要在更新UI之前将数据获取到主线程。相反,您应该按照执行,只需使用将更改推送到主线程,并在中的主线程上处理它们

如果你需要更一般的东西,你也可以考虑使用java. UTI.Orth.例如,BlockingQueue可用于实现消费者/生产者模式。请参阅。

所有异步任务(除非使用提供的执行器执行)都在同一后台线程上运行,因此无法同时执行它们

从文件:

首次引入时,AsyncTasks是在单个服务器上串行执行的 背景线程。从甜甜圈开始,它被改成了一个 允许多个任务并行运行的线程。从 蜂窝,任务在单个线程上执行,以避免常见的 并行执行导致的应用程序错误

如果确实需要并行执行,可以调用 executeOnExecutor(java.util.concurrent.Executor,对象[])与 线程池执行器


好的,让我们这么说吧->LoadDataClass(asynctask)-在活动中的doInbackground Monitor异步任务期间设置进度变量->检查LoadDataClass中的进度变量,并为其显示example@AlexonProgressUpdate在UI线程上运行,因此将数据传递到此线程(这就是AsyncTask中的第二个参数的用途)操作系统负责线程之间的编组。或者你可以称之为活动。runOnUiThread@Alex更新了一个例子谢谢大家!我将尝试做类似的事情,但一般来说,两个异步任务交换信息怎么样。甚至是两条线?信号量和互斥量可以,但当您实现它们时,2个或更多线程可以t使用相同的资源。当然,谁会希望2-3个或更多线程在同一空间中工作,但例如,如果两个人正在向数组添加信息,您可能会说OK。。两个线程知道正在使用和正在使用哪个索引,这样它们就不会相互干扰了。最好尽可能使用现有的实用程序,如我在回答中提到的BlockingQueue。BlockingQueue可以处理多个生产者,类似于您的阵列示例。如果你必须做一些定制的事情,那么保持它尽可能的简单是最好的——例如,只使用粗粒度的锁定来确保串行访问,而不是试图用volatile实现一个非锁定解决方案。我建议阅读go to book.FYI,异步任务的onProgressUpdate方法发生在UI线程上;AsyncTask是为了帮助人们避免处理程序的细节而编写的(尽管我通常发现它们比它们的价值更麻烦)。你说得对,正如我所建议的,使用处理程序只是重新实现onProgressUpdate的一种手动方式。我要修改我的答案。