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 类重写我的代码。