Android 线程处理程序始终为空



我正在尝试编写一个 android 应用程序来监控室外丙烷燃烧器,主要用于豚骨拉面,这需要将猪肉炖很多小时。我有一个Arduino电路,可以检测火焰并在火焰被吹灭或燃烧器用完丙烷时发送UDP数据包。我从未编写过Android应用程序,所以我发现自己被困在基本的Android原理上。我创建了一个名为HamNetService- 用于监控火腿。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方法,该方法又使用未初始化的处理程序

最新更新