我正在尝试编写一个 android 应用程序来监控室外丙烷燃烧器,主要用于豚骨拉面,这需要将猪肉炖很多小时。我有一个Arduino电路,可以检测火焰并在火焰被吹灭或燃烧器用完丙烷时发送UDP数据包。我从未编写过Android应用程序,所以我发现自己被困在基本的Android原理上。我创建了一个名为HamNet
的Service
- 用于监控火腿。HamNet
有一个ArduinoUDPListener
(Thread
(。我需要将事件从ArduinoUDPListener
线程发送到MainActivity
,因此我在主 UI 线程中创建了一个Handler
,并在启动时将该mHandler
传递给netService
,但由于某种原因,mainThreadHdlr
在将监控数据发送到主 UI 线程时始终为 null。我误解了安卓线程处理程序吗?我需要实例化多少个?我什至应该将它们从一条线传递到另一根线吗?
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;
}
谢谢!
我的猜测是,发生这种情况是因为您在启动服务后初始化了处理程序:
context.startForegroundService(serviceIntent);
mainThreadHdlr = hdlr;
方法startForegroundService
调用重写的onStartCommand
方法,该方法又使用未初始化的处理程序