Java 将数据从服务的线程发送到活动
我了解了如何将声明为活动的线程中的数据发送到此活动本身。但是,我不知道如何从服务线程获取数据,然后将其发送到我的活动。我有点困惑,我还需要使用Handler吗 编辑:我找到了解决办法!让我们总结一下。首先,在活动中声明处理程序,在启动服务之前,通过添加链接到处理程序的新Messenger来添加一些额外数据Java 将数据从服务的线程发送到活动,java,android,multithreading,service,Java,Android,Multithreading,Service,我了解了如何将声明为活动的线程中的数据发送到此活动本身。但是,我不知道如何从服务线程获取数据,然后将其发送到我的活动。我有点困惑,我还需要使用Handler吗 编辑:我找到了解决办法!让我们总结一下。首先,在活动中声明处理程序,在启动服务之前,通过添加链接到处理程序的新Messenger来添加一些额外数据 public class HomeActivity extends ActionBarActivity { ConnectionDetector m_cd; Intent m_
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。这是一个复杂的功能。或者你可以使用广播接收器在两者之间进行通信,哪一个更容易,但是我更喜欢第一个。你有什么关于如何做到这一点的线索吗?好的,我已经找到了解决方案。见我编辑的帖子。