2013-07-03 41 views
1

ListView從後臺線程中加載,後臺線程調用從SQLite數據庫獲取值並將其加載到ArrayList中。 此線程顯示結果調用一個CustomHandler,但它不接收來自線程的消息。Android - 在處理程序上無法接收消息

下面是一個示例代碼:

HandlerThread thread;

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

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

I如果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(消息MSG)插入處理程序創建通過重寫它:


我通過編輯代碼,這個發現溶液。 在pskink的建議,現在我通過使用CursorAdapter類重寫我的代碼。

+0

任何嚴重的原因不要使用CursorLoader&CursorAdapter? – pskink

+0

我不知道它的存在,謝謝! – Lemmy4555

回答

0

我記得,你不能在沒有調用Looper.prepare()的線程中創建一個處理程序。嘗試把你的run()方法放在最頂端的這兩行

Looper.myLooper(); 
Looper.prepare(); 
+0

我已經嘗試過,但沒有,我在幾分鐘前找到解決方案。 – Lemmy4555

+0

爲什麼不在這裏發佈解決方案? –

+0

已發佈在頂部^^ – Lemmy4555