ListView는 SQLite 데이터베이스에서 값을 가져 와서 ArrayList에로드하는 백그라운드 스레드에서로드됩니다. 결과를 표시 할이 스레드는 CustomHandler를 호출하지만 스레드로부터 메시지를 수신하지 않습니다. 여기 안드로이드 - 핸들러에서 메시지를받을 수 없습니다.
은 샘플 코드입니다 :HandlerThread 스레드;
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 내 핸들러가 Log.i() 여기
안에 내 전체 코드를 텍스트가 표시되지 않는 이유
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");
}
}
이해가 안 돼요 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();
}
});
}
}
핸들러가 메시지를받지 못하면 ListView를 표시 할 수 없습니다. 내가 그것을 재정의 핸들러 생성에 handleMessage (메시지 MSG)를 구현
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();
}
}
:
에서이 두 줄 CursorLoader & CursorAdapter를 사용하지 않는 심각한 이유? – pskink
나는 그 존재를 알지 못했다. 고마워! – Lemmy4555