我正在下载并在应用启动时更新数据。如果连接失败,我正在使用计时器进行重试。
我的代码:
void listConversations() {
Ion.with(context, "url")
.asJsonArray()
.setCallback(new FutureCallback<JsonArray>() {
@Override
public void onCompleted(Exception e, final JsonArray result) {
if (e == null) {
new Thread(new Runnable() {
public void run() {
for (int i=1; i<result.size(); i++) {
JsonObject newData=result.get(i).getAsJsonObject();
_db.updateConversation(newData);
}
((ConversationsAdapter) conversationsAdapter).updateConversations(conversationsList);
}
}).start();
}else{
new Timer().schedule(new TimerTask() {
@Override
public void run() {
listConversations();
}
}, 10000);
}
}
});
}
如果连接成功,我的代码工作正常。但是如果连接失败,此方法每10秒调用一次。然后如果重试后连接成功,我的应用程序将崩溃并显示以下日志:
02-02 00:30:55.682: E/AndroidRuntime(21820): FATAL EXCEPTION: Thread-642
02-02 00:30:55.682: E/AndroidRuntime(21820): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
02-02 00:30:55.682: E/AndroidRuntime(21820): at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:5908)
02-02 00:30:55.682: E/AndroidRuntime(21820): at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:837)
02-02 00:30:55.682: E/AndroidRuntime(21820): at android.view.View.requestLayout(View.java:15792)
02-02 00:30:55.682: E/AndroidRuntime(21820): at android.view.View.requestLayout(View.java:15792)
02-02 00:30:55.682: E/AndroidRuntime(21820): at android.view.View.requestLayout(View.java:15792)
02-02 00:30:55.682: E/AndroidRuntime(21820): at android.view.View.requestLayout(View.java:15792)
02-02 00:30:55.682: E/AndroidRuntime(21820): at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:358)
我猜它正在尝试从另一个线程访问ui。我该如何解决这个问题?我需要在另一个线程中执行db操作。
答案 0 :(得分:0)
你是对的,你试图从他们不属于的线程中操纵视图。您应该为此类任务使用处理程序。
创建一个像这样的处理程序
Handler h = new Handler(){
@Override
public void handleMessage(Message msg){
if(msg.what == 0){
listConversations();
}
}
};
并像这样更改代码的else部分
new Timer().schedule(new TimerTask() {
@Override
public void run() {
h.sendEmptyMessage(0);
}
}, 10000);