Android - ViewRootImpl$CalledFromWrongThreadException
Solution 1:
I got the same problem trying to change UI view from c++ using JNI. The solution was use
runOnUiThread(new Runnable() {
public void run(){
}
});
runOnUiThread is an Activity method so I have to make my activity instance public static to be able to call on my public static method who later call from JNI.
Hope this help others :)
PS: from here I learn how to use JNI http://www.cocos2d-x.org/projects/cocos2d-x/wiki/How_to_use_jni for my android game previously made with cocos2dx
Solution 2:
Put this in onCreate()
ImageView imageView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.order);
imageView = (ImageView)findViewById(R.id.imgView);
new DownloadFilesTask().execute();
}
And your AsyncTask
class should be like this,
private class DownloadFilesTask extends AsyncTask<Void, Void, Void> {
Drawable drawable;
@Override
protected Void doInBackground(Void... params) {
drawable = createDrawableFromURL(
"http://savagelook.com/misc/sl_drop2.png");
return null;
}
protected void onPostExecute(Void result) {
imageView.setImageDrawable(drawable);
}
}
Solution 3:
I think this line is causing the error..
imageView.setImageDrawable(createDrawableFromURL("http://savagelook.com/misc/sl_drop2.png"));
and the error explains why it is so..
Only the original thread that created a view hierarchy can touch its views.
this error is caused because you are trying to change the User Interface on mainthread from some other thread.. here doInBackground in your case...