Android - ViewRootImpl $CalledFromWrongThreadException
Я использовал этот, чтобы отображать изображения из Интернета, но это вызывает ошибку, как показано ниже:
04-12 13: 45: 05.337: E/AndroidRuntime (27897): Caused by: android.view.ViewRootImpl $CalledFromWrongThreadException: только исходный поток, создавший иерархию представлений, может коснуться его представлений.
public class Order extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
new DownloadFilesTask().execute();
}
private class DownloadFilesTask extends AsyncTask<Void, Void, Void> {
protected void onPostExecute(Void result) {
}
@Override
protected Void doInBackground(Void... params) {
setContentView(R.layout.order);
ImageView imageView = (ImageView)findViewById(R.id.imgView);
imageView.setImageDrawable(createDrawableFromURL("http://savagelook.com/misc/sl_drop2.png"));
return null;
}
}
private Drawable createDrawableFromURL(String urlString) {
Drawable image = null;
try {
URL url = new URL(urlString);
InputStream is = (InputStream)url.getContent();
image = Drawable.createFromStream(is, "src");
} catch (MalformedURLException e) {
image = null;
} catch (IOException e) {
image = null;
}
return image;
}
}
Ответы
Ответ 1
Поместите это в 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();
}
И ваш класс AsyncTask
должен быть таким,
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);
}
}
Ответ 2
У меня возникла такая же проблема, пытаясь изменить представление пользовательского интерфейса из С++ с использованием JNI. Решением было использование
runOnUiThread(new Runnable() {
public void run(){
}
});
runOnUiThread - это метод Activity, поэтому я должен сделать свой экземпляр активности public static, чтобы иметь возможность вызвать мой публичный статический метод, который позже вызывает JNI.
Надеюсь, что это поможет другим:)
PS: отсюда я узнаю, как использовать JNI http://www.cocos2d-x.org/projects/cocos2d-x/wiki/How_to_use_jni для моей игры Android, сделанной ранее с cocos2dx
Ответ 3
Я думаю, что эта строка вызывает ошибку.
imageView.setImageDrawable(createDrawableFromURL("http://savagelook.com/misc/sl_drop2.png"));
и ошибка объясняет, почему это так.
Only the original thread that created a view hierarchy can touch its views.
эта ошибка вызвана тем, что вы пытаетесь изменить пользовательский интерфейс на mainthread из какого-то другого потока. Здесь doInBackground в вашем случае...
Ответ 4
Если вы хотите выполнить эту работу во фрагменте, вам следует вызвать поток пользовательского интерфейса из действия во фрагменте.
getActivity().runOnUiThread(new Runnable() {
public void run(){
... //your job
}
});
@canerkaseler