ListView是从后台线程加载的,该线程从SQLite数据库调用get值并将它们加载到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()中显示文本
这里是我的完整代码:
第一部分:
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();
}
});
}
}
如果处理程序没有收到消息,我无法显示我的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类重写我的代码。
我记得,你不能在一个没有调用Looper.prepare()的线程中创建一个处理程序。试着把这两行放在你run()方法的最上面
Looper.myLooper();
Looper.prepare();
如果我创建上面的类并尝试在tomcat7上部署war,我会看到以下错误。
我正在使用netty构建一个应用程序。在应用程序中,我需要处理传入和传出的消息。要求是应用程序将发送的任何消息都应由特定的处理程序处理,进入应用程序的任何消息都应由另一个特定的处理程序处理。但是,我希望在两个处理程序之间交换消息,以便能够跟踪发送的消息响应,因为请求消息也将发送到应用程序。 请任何想法hwo实施这样的要求。这个问题听起来可能不相关,但这就是我得到的,我还不是一个网络极客。我读到的关
用于测试以下: 我写了一个配置类: 和一个测试类: 测试将在接收方法处等待5秒,我将得到一个导致测试失败的空对象。但是,如果我定义一个真实对象而不是模拟对象,就像: 然后,我可以从通道(outputChannel),与发送的内容相同。在测试中使用模拟处理程序有什么解决方案吗?
我正在开发简单的android应用程序,非常新的解析。我遵循解析文档添加后端功能。解析核心是一个简单的部分,但我不能发送推送通知从android设备。但从解析仪表板发送时会收到推送通知。我的清单文件如下: 订阅活动类中的频道: 正在另一个活动类中发送推送通知: 在“installation”类中添加了行,而GCMSenderId为空!!这是问题所在吗?请帮助我,为什么我不能收到通知时,从我的and
嗨,我是Kafka的新手,我有一个快速的问题。 我实现了一个kafka生产者和消费者zookeeper和生产者在另一个服务器(192.168.10.233)中运行,消费者在另一个服务器(192.168.10.234)中运行,两者都是本地连接的 我还从外面查了192.168.10.233:9092,港口是否没有被任何东西堵塞。
我已经在创建服务方法上注册了接收者,并在销毁方法上取消注册?它工作得很好,但在某些三星Galaxy s3上,即使我停止服务,我仍然会收到接收器。如何找到解决办法?有可能吗?请帮帮我.提前致谢 }