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類重寫我的代碼。
任何嚴重的原因不要使用CursorLoader&CursorAdapter? – pskink
我不知道它的存在,謝謝! – Lemmy4555