我正在尝试写一个android应用程序来监控室外丙烷燃烧,主要是对通国拉面的监控,这需要用文火煮猪肉好几个小时。我有一个Arduino电路,它可以检测火焰,并发送UDP数据包,如果火焰被吹灭或燃烧用完丙烷。我从来没有写过android应用程序,所以我发现自己被困在android的基本原理上。我创建了一个名为HamNet的Service,用于监控火腿。HamNet有一个ArduinoUDPListener (Thread)。我需要将事件从ArduinoUDPListener线程发送到MainActivity,因此我在主UI线程中创建了一个Handler,并在它启动时将该mHandler传递给netService,但是由于某些原因,在将监控数据发送到主UI线程时,mainThreadHdlr始终为null。我是不是误解了android线程处理器?我需要实例化多少个?我甚至应该在线程之间传递它们吗?
public class MainActivity extends AppCompatActivity {
private Handler mHandler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message inputMessage) {
System.out.println("Got msg!");
super.handleMessage(inputMessage);
}
};
netService = new HamNet();
netService.startNetwork(getApplicationContext(), mHandler);
}
private HamNet netService;
}
public class HamNet extends Service {
private Handler mainThreadHdlr;
public void startNetwork(Context context, Handler hdlr) {
Intent serviceIntent = new Intent(context,HamNet.class);
context.startForegroundService(serviceIntent);
mainThreadHdlr = hdlr;
assert mainThreadHdlr != null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
System.out.println("-=-=-=-=- onStartCommand()");
udpListener = new ArduinoUDPListener();
udpListener.start();
return START_STICKY;
}
private class ArduinoUDPListener extends Thread {
public void run() {
System.out.println("-=-=-=-=- ArduinoUDPListener.run()");
if (mainThreadHdlr != null) {
Message msg = mainThreadHdlr.obtainMessage();
msg.obj = update;
mainThreadHdlr.sendMessage(msg);
System.out.println("sent msg!");
} else {
System.out.println("null?");
}
}
}
private ArduinoUDPListener udpListener;
}谢谢!
发布于 2019-08-12 04:11:20
我的猜测是,这是因为您在启动服务后初始化了处理程序:
context.startForegroundService(serviceIntent);
mainThreadHdlr = hdlr;方法startForegroundService调用被覆盖的onStartCommand方法,该方法反过来使用未初始化的处理程序
https://stackoverflow.com/questions/57453004
复制相似问题