2013-07-03 2 views
1

ListView загружается из фонового потока, который вызывает получение значений из базы данных SQLite и загружает их в ArrayList. Этот поток для отображения результатов вызывает CustomHandler, но он не получает сообщений из потока.Android - Не удается получить сообщение на обработчике

Вот пример кода:

HandlerThread нить;

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

I не может показать мой listView, если Handler не получает сообщения.


Я нашел решение, редактируя код такой: это

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) в создании обработчика путем переопределения его. В предложении pskink, теперь я переписываю свой код с помощью класса CursorAdapter.

+0

любая серьезная причина не использовать CursorLoader & CursorAdapter? – pskink

+0

Я не знал о его существовании, спасибо! – Lemmy4555

ответ

0

Как я помню, вы не можете создать обработчик внутри потока, который не вызвал Looper.prepare(). Попробуйте ввести в ваш метод run() эти две строки вверху

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

Я уже пробовал, но не хочу, я нашел решение несколько минут назад. – Lemmy4555

+0

Почему вы не отправляете решение здесь? –

+0

Уже отправлено на Top ^^ – Lemmy4555

Смежные вопросы