Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/218.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 将数据从服务的线程发送到活动_Java_Android_Multithreading_Service - Fatal编程技术网

Java 将数据从服务的线程发送到活动

Java 将数据从服务的线程发送到活动,java,android,multithreading,service,Java,Android,Multithreading,Service,我了解了如何将声明为活动的线程中的数据发送到此活动本身。但是,我不知道如何从服务线程获取数据,然后将其发送到我的活动。我有点困惑,我还需要使用Handler吗 编辑:我找到了解决办法!让我们总结一下。首先,在活动中声明处理程序,在启动服务之前,通过添加链接到处理程序的新Messenger来添加一些额外数据 public class HomeActivity extends ActionBarActivity { ConnectionDetector m_cd; Intent m_

我了解了如何将声明为活动的线程中的数据发送到此活动本身。但是,我不知道如何从服务线程获取数据,然后将其发送到我的活动。我有点困惑,我还需要使用Handler吗

编辑:我找到了解决办法!让我们总结一下。首先,在活动中声明处理程序,在启动服务之前,通过添加链接到处理程序的新Messenger来添加一些额外数据

public class HomeActivity extends ActionBarActivity
{
    ConnectionDetector m_cd;
    Intent m_networkListenerService;

    public Handler m_handler = new Handler()
    {
        @Override
        public void handleMessage(Message msg)  // This is where main activity thread receives messages
        {
            Bundle  bundle;
            if (msg.what == 1)  //  1 MEANS NEW ELEMENT
            {
                bundle = msg.getData();
                System.out.println( bundle.getString("name"));
            }
            super.handleMessage(msg);
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);

        this.m_networkListenerService = new Intent(this, Network.class);
        this.m_networkListenerService.putExtra("Messenger", new Messenger(this.m_handler));
        this.startService(this.m_networkListenerService);

    }
}
然后,在服务类中,您可以对IntentService类执行相同的操作,将Messenger取回,并将其作为参数发送到线程类:

public class Network extends Service
{
    NetworkListenerThread  m_networkListenerThread;
    Messenger   m_messenger;

    @Override
    public void onCreate()  {   super.onCreate();   }

    @Override
    public void onDestroy() {   super.onDestroy();  }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId)
    {
        if (intent != null)
        {
            Bundle extras = intent.getExtras();
            if (extras != null)
            {
                this.m_messenger = (Messenger)extras.get("Messenger");
                this.m_networkListenerThread = new NetworkListenerThread(m_messenger);
                this.m_networkListenerThread.start();
            }
        }
        return Service.START_STICKY;
    }
}
public class NetworkListenerThread extends Thread
{
    private static final int BROADCAST_PORT = 4415;
    private DatagramSocket  m_socket = null;
    private Messenger   m_messenger; 

    public  NetworkListenerThread(Messenger messenger)
    {
        this.m_messenger = messenger;
    }
}
再次将Messenger返回到线程类:

public class Network extends Service
{
    NetworkListenerThread  m_networkListenerThread;
    Messenger   m_messenger;

    @Override
    public void onCreate()  {   super.onCreate();   }

    @Override
    public void onDestroy() {   super.onDestroy();  }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId)
    {
        if (intent != null)
        {
            Bundle extras = intent.getExtras();
            if (extras != null)
            {
                this.m_messenger = (Messenger)extras.get("Messenger");
                this.m_networkListenerThread = new NetworkListenerThread(m_messenger);
                this.m_networkListenerThread.start();
            }
        }
        return Service.START_STICKY;
    }
}
public class NetworkListenerThread extends Thread
{
    private static final int BROADCAST_PORT = 4415;
    private DatagramSocket  m_socket = null;
    private Messenger   m_messenger; 

    public  NetworkListenerThread(Messenger messenger)
    {
        this.m_messenger = messenger;
    }
}
最后,无论您想在何处发送数据,请使用以下代码:

Message msg = Message.obtain();   //  Creates a message from the message handler to send it back to the main UI
msg.what = 1;   //  Specifies the type of message
Bundle bundle = new Bundle(1); //  Object of size 1 in which we put the data in
bundle.putString("name", name); //  Key + data (which is a String)
msg.setData(bundle); //  Attaches the bundle to the message
try {   this.m_messenger.send(msg); }  //  We use the Messenger from the main thread to send the data 
catch (RemoteException e) { e.printStackTrace();    }

您必须使用处理程序,您需要让活动中的messenger将其id发送给另一个使用该id的服务中的messenger。然后在解析数据后将其发送回messenger id。这是一个复杂的功能。或者你可以使用广播接收器在两者之间进行通信,哪一个更容易,但是我更喜欢第一个。你有什么关于如何做到这一点的线索吗?好的,我已经找到了解决方案。见我编辑的帖子。