当前位置: 首页 > 知识库问答 >
问题:

Android -无法在处理程序上接收消息

安泰平
2023-03-14

ListView是从后台线程加载的,该线程从SQLite数据库调用get值并将它们加载到ArrayList中。这个显示结果的线程调用一个CustomHandler,但它不接收来自线程的消息。

下面是一个示例代码:

处理线程线程;

public void myFunction(){
    thread = new HandlerThread("UIThread"){
        CustomHandler handler = new CustomHandler();
        public void run(){
            handler.sendEmptyMessage(0);
        }
    };
    thread.start();
}

private class CustomHandler extends Handler{
    public CustomHandler(){
        super();
    }

   @Override
    public void handleMessage(Message msg){
        Log.i("Test","Test");
    }
}

我不明白为什么我的处理程序不在Log. i()中显示文本

这里是我的完整代码:

第一部分:

private void caricaSintomi(){
    Log.i(Strumenti.NOMEAPP, "Inizio caricamento dei sintomi");
    HandlerThread thSintomi = new HandlerThread("UIThread"){
        private ArrayList<Sintomo> array;
        private CaricaSintomiHandler caricaSintomihandler;

        public void run(){
            Log.i(Strumenti.NOMEAPP, "Caricamento dei sintomi...");
            array = new ArrayList<Sintomo>();
            HashMap<String, ArrayList<String>> tabella = MainActivity.db.getTabella(TABELLA);   
            for(int j=0;j<tabella.get("Sintomi_malattie").size();j++){
                Sintomo sintomo = new Sintomo(Integer.parseInt(tabella.get("_id").get(j)),
                        tabella.get("Sintomi_malattie").get(j));
                array.add(sintomo);
            }
            Log.i(" ", "a "+array.get(0).getTesto());
            This.getLooper();
            caricaSintomihandler = new CaricaSintomiHandler(getThis(), array); //getThis is a class method that return the class itself (SintomiActivity.java)
            caricaSintomihandler.sendEmptyMessage(0); //Invio del messaggio per aggiornare la ListView
            Log.i(Strumenti.NOMEAPP, "Caricamento avvenuto con successo");
        }
    };
    thSintomi.start();
}

第2部分:

 private static class CaricaSintomiHandler extends Handler{

    private final WeakReference<SintomiActivity> mActivity;
    private ArrayList<Sintomo> array;

    public CaricaSintomiHandler(SintomiActivity activity, ArrayList<Sintomo> array){
        super();
        this.mActivity = new WeakReference<SintomiActivity>(activity);
        this.array = array;
    }

    @Override
    public void handleMessage(Message msg){
        final SintomiActivity activity = mActivity.get();
        Log.i(" ","b "+ array.get(0).getTesto());
        activity.runOnUiThread(new Runnable() {
            public void run() {
                Log.i(" ","c "+ array.get(0).getTesto());
                for(int i=0; i < array.size(); i++){
                    activity.arraySintomi.add(array.get(i));
                }
                activity.visualizzaSintomi();
            }
        });
    }
}

如果处理程序没有收到消息,我无法显示我的listView。


我通过编辑代码找到了解决方案,如下所示:

private void caricaSintomi(){
    Log.i(Strumenti.NOMEAPP, "Inizio caricamento dei sintomi");
    HandlerThread thSintomi = new HandlerThread("UIThread"){
        private ArrayList<Sintomo> array;
        private CaricaSintomiHandler handler = new CaricaSintomiHandler(){
            @Override
            public void handleMessage(Message msg){
                Log.i(" ","b "+ array.get(0).getTesto());
                runOnUiThread(new Runnable() {
                    public void run() {
                        Log.i(" ","c "+ array.get(0).getTesto());
                        for(int i=0; i < array.size(); i++){
                            arraySintomi.add(array.get(i));
                        }
                        visualizzaSintomi();
                    }
                });
            }
        };

        public void run(){
            CursorAdapter ca = new CursorAdapter(getApplicationContext(), null) {

                @Override
                public View newView(Context arg0, Cursor arg1, ViewGroup arg2) {
                    // TODO Auto-generated method stub
                    return null;
                }

                @Override
                public void bindView(View arg0, Context arg1, Cursor arg2) {
                    // TODO Auto-generated method stub

                }
            };

            Log.i(Strumenti.NOMEAPP, "Caricamento dei sintomi...");
            array = new ArrayList<Sintomo>();
            /*
             * Vengono caricati tutti i farmaci riga per riga.
             */
            HashMap<String, ArrayList<String>> tabella = MainActivity.db.getTabella(TABELLA);   
            //Invio query per ottenere un intervallo di tabella
            //Inserimento dei risultati all'interno di @array
            for(int j=0;j<tabella.get("Sintomi_malattie").size();j++){
                Sintomo sintomo = new Sintomo(Integer.parseInt(tabella.get("_id").get(j)),
                        tabella.get("Sintomi_malattie").get(j));
                array.add(sintomo);
            }
            Log.i(" ", "a "+array.get(0).getTesto());
            handler.sendEmptyMessage(0); //Invio del messaggio per aggiornare la ListView
            Log.i(Strumenti.NOMEAPP, "Caricamento avvenuto con successo");
        }
    };
    thSintomi.start();
}


private static class CaricaSintomiHandler extends Handler{

    public CaricaSintomiHandler(){
        super();
    }
}

我通过重写handleMessage(Message msg)来将它实现到处理程序创建中。根据pskink的建议,现在我正在使用CursorAdapter类重写我的代码。

共有1个答案

师成弘
2023-03-14

我记得,你不能在一个没有调用Looper.prepare()的线程中创建一个处理程序。试着把这两行放在你run()方法的最上面

Looper.myLooper();
Looper.prepare();
 类似资料:
  • 如果我创建上面的类并尝试在tomcat7上部署war,我会看到以下错误。

  • 我正在使用netty构建一个应用程序。在应用程序中,我需要处理传入和传出的消息。要求是应用程序将发送的任何消息都应由特定的处理程序处理,进入应用程序的任何消息都应由另一个特定的处理程序处理。但是,我希望在两个处理程序之间交换消息,以便能够跟踪发送的消息响应,因为请求消息也将发送到应用程序。 请任何想法hwo实施这样的要求。这个问题听起来可能不相关,但这就是我得到的,我还不是一个网络极客。我读到的关

  • 用于测试以下: 我写了一个配置类: 和一个测试类: 测试将在接收方法处等待5秒,我将得到一个导致测试失败的空对象。但是,如果我定义一个真实对象而不是模拟对象,就像: 然后,我可以从通道(outputChannel),与发送的内容相同。在测试中使用模拟处理程序有什么解决方案吗?

  • 我正在开发简单的android应用程序,非常新的解析。我遵循解析文档添加后端功能。解析核心是一个简单的部分,但我不能发送推送通知从android设备。但从解析仪表板发送时会收到推送通知。我的清单文件如下: 订阅活动类中的频道: 正在另一个活动类中发送推送通知: 在“installation”类中添加了行,而GCMSenderId为空!!这是问题所在吗?请帮助我,为什么我不能收到通知时,从我的and

  • 嗨,我是Kafka的新手,我有一个快速的问题。 我实现了一个kafka生产者和消费者zookeeper和生产者在另一个服务器(192.168.10.233)中运行,消费者在另一个服务器(192.168.10.234)中运行,两者都是本地连接的 我还从外面查了192.168.10.233:9092,港口是否没有被任何东西堵塞。

  • 我已经在创建服务方法上注册了接收者,并在销毁方法上取消注册?它工作得很好,但在某些三星Galaxy s3上,即使我停止服务,我仍然会收到接收器。如何找到解决办法?有可能吗?请帮帮我.提前致谢 }