1

ListView 是从后台线程加载的,该线程调用从 SQLite 数据库获取值并将它们加载到 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() 中显示文本

这是我的完整代码:

第1部分 :

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();
            }
        });
    }
}

如果 Handler 没有收到消息,我无法显示我的 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 类重写我的代码。

4

1 回答 1

0

我记得,你不能在没有调用 Looper.prepare() 的线程中创建处理程序。尝试将这两行放在你的 run() 方法的顶部

Looper.myLooper();
Looper.prepare();
于 2013-07-03T14:14:10.237 回答