多线程用于更新数据

时间:2015-02-02 00:41:11

标签: android

我正在下载并在应用启动时更新数据。如果连接失败,我正在使用计时器进行重试。

我的代码:

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操作。

1 个答案:

答案 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);