从后台线程加载ListView,该后台线程从SQLite数据库调用get值并将它们加载到ArrayList中。 此线程显示结果调用CustomHandler,但它不接收来自线程的消息。
以下是示例代码:
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();
}
});
}
}
如果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类重写我的代码。
答案 0 :(得分:0)
我记得,你不能在一个没有调用Looper.prepare()的线程中创建一个处理程序。尝试在顶部放入run()方法这两行
Looper.myLooper();
Looper.prepare();