I am downloading and updating data when app starts.And if connection fails,i am using timer for retry.
My code:
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);
}
}
});
}
If connection is successful,my code is working great.But if connection fails,this method calling every 10 seconds.Then if connects successful after retry,my app is crashing with following log:
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)
I guess it is trying access ui from another thread.How can I resolve this ? I need to do db operations in another thread.