Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.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_Multithreading_Android Asynctask - Fatal编程技术网

Java 具有动态活动的Android句柄线程

Java 具有动态活动的Android句柄线程,java,android,multithreading,android-asynctask,Java,Android,Multithreading,Android Asynctask,我正在开发一个Android网络应用程序。我希望有一个工作线程,它将通过套接字处理所有传入数据)。线程将始终处于活动状态 我可以从我的一个活动开始线程,但是在活动更改后如何处理它 我所说的句柄是指如何与线程交互(将数据从线程传递到当前UI或从当前UI向线程发送数据) 我正在研究AsyncTask,但我不确定它是否可以用于我的情况对于这个需求,我建议您创建并使用JAX-WS或JAX-RS。这里有很多例子充分描述了这一点。在这种情况下,您可以轻松地使用AsyncTask看,我想这个解决方案可以满足您

我正在开发一个Android网络应用程序。我希望有一个工作线程,它将通过套接字处理所有传入数据)。线程将始终处于活动状态

我可以从我的一个活动开始线程,但是在活动更改后如何处理它

我所说的句柄是指如何与线程交互(将数据从线程传递到当前UI或从当前UI向线程发送数据)


我正在研究
AsyncTask
,但我不确定它是否可以用于我的情况

对于这个需求,我建议您创建并使用JAX-WS或JAX-RS。
这里有很多例子充分描述了这一点。在这种情况下,您可以轻松地使用AsyncTask

看,我想这个解决方案可以满足您的需要

我同意这一点:

Handler mHandler = new Handler();

Thread t = new Thread(new Runnable(
  @Override
  public void run () {

   while (true /* or your breaking condition */) {
   //Here you put your socket algorithm

    mHandler.post(new Runnable() {
      @Override
      public void run () {
         //Here you put every change you want to do on UI thread
       }
     } 
     //This is necessary to reduce process consumption
      try { 
        Thread.sleep(30L);
      } catch (Exception e) {
          e.printStackTrace();
      }
    }
  }));
t.start();
如何知道在哪个用户界面上 您创建的每个处理程序都附加到创建它的类。 正如你在这里看到的

例如,如果您有一个扩展活动的类,并且您在该类中创建了一个处理程序,那么它将在该UI线程上工作。

我想您应该看看两个模型中的一个

第一种方法是使用一个将“拥有”套接字连接的服务。第二种方法是旋转HandlerThread以“拥有”连接。您所选择的是基于套接字正在执行的操作

如果套接字连接包含您需要接收的数据(通常是本地缓存的数据),那么服务更合适,因为在服务中运行意味着您的工作最终会完成。另一方面,如果您正在做一些事情,比如下载一个只在UI中显示的图像,那么使用原始HandlerThread可能是正确的选择。这里的理由是,当你的UI消失时,你的套接字连接也可能被关闭。换句话说,选择是基于数据使用的短暂性

现在,如果你要使用一个服务,请,请,使用一个IntentService,它将处理在适当的时间关闭服务的奇怪细节。它还会将处理代码放在正确的线程上默认情况下发送给服务的命令在应用程序的主/UI线程上运行。IntentService将工作封送到后台线程

如果要使用HandlerThread,我将创建一个扩展HandlerThread的类,然后使用singleton模式处理从任何活动访问同一个HandlerThread


但要问自己的一个重要问题是服务或HandlerThread何时关闭。工作何时完成,如何发出信号?只是当不再有数据到达时?当你的应用程序界面进入后台时?

你肯定需要使用服务@VM我正在查看你的链接。我想我得努力了。谢谢,我假设这段代码是在活动中执行的。如果我改变活动怎么办?socket算法有效吗?以及如何知道我正在使用的UI。感谢此代码可以放在活动或服务中。“改变活动”是什么意思?您的意思是切换到其他活动或关闭应用程序?在这两种情况下,当Android销毁应用程序时,该过程将停止。如果你想让它继续运行,你最好选择一个服务而不是一个活动这里似乎有一个误解,即两个不同的活动类有不同的UI线程,它们没有。一个进程只有一个UI线程(更恰当地称为“主线程”)。给定Android包中的所有活动实例共享主线程上运行的相同事件循环。处理程序没有直接连接到某个活动类,除非它是该活动的内部类。此外,您在这里实际上滥用了线程模型。没有理由忙着等待你现在所做的事情。除非您确实知道需要,否则不要在循环中睡觉,让调度程序决定您是否应该运行。比Thread.sleep()更好的方法是使用HandlerThread并在将来发布一条消息来运行下一次迭代,无论您想做什么。此外,如果I/O线程正在调用socket.read(),那么在处理器等待数据到达时,很可能会产生处理器。@cyngus,解释得很好。“睡眠是循环中的一个线程”这一概念是我过去一直怀疑的。但我很久以前就找到了解决办法。这对我很有效,让我懒得去寻找更好的解决方案。关于处理程序,
当您创建一个新的处理程序时,它被绑定到正在创建它的线程的线程/消息队列
是我们在文档中看到的。这就是我的意思。也许我应该更好地解释我自己。只要我的程序还在运行,我的套接字就会处理传入的套接字数据。我想我真的需要看看服务。我找到了一些关于服务和意向服务的文件。我会像你说的那样去IntentService。非常感谢你。