首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android线程处理程序始终为空

Android线程处理程序始终为空
EN

Stack Overflow用户
提问于 2019-08-12 03:35:09
回答 1查看 23关注 0票数 1

我正在尝试写一个android应用程序来监控室外丙烷燃烧,主要是对通国拉面的监控,这需要用文火煮猪肉好几个小时。我有一个Arduino电路,它可以检测火焰,并发送UDP数据包,如果火焰被吹灭或燃烧用完丙烷。我从来没有写过android应用程序,所以我发现自己被困在android的基本原理上。我创建了一个名为HamNetService,用于监控火腿。HamNet有一个ArduinoUDPListener (Thread)。我需要将事件从ArduinoUDPListener线程发送到MainActivity,因此我在主UI线程中创建了一个Handler,并在它启动时将该mHandler传递给netService,但是由于某些原因,在将监控数据发送到主UI线程时,mainThreadHdlr始终为null。我是不是误解了android线程处理器?我需要实例化多少个?我甚至应该在线程之间传递它们吗?

代码语言:javascript
复制
 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;
 }

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2019-08-12 04:11:20

我的猜测是,这是因为您在启动服务后初始化了处理程序:

代码语言:javascript
复制
context.startForegroundService(serviceIntent);
mainThreadHdlr = hdlr;

方法startForegroundService调用被覆盖的onStartCommand方法,该方法反过来使用未初始化的处理程序

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57453004

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档