インターネットから画像を表示するために this を使用していましたが、次のようにエラーがスローされます。
04-12 13:45:05.337:E/AndroidRuntime(27897):原因: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;
}
}
これを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);
}
}
JNIを使用してc ++からUIビューを変更しようとすると、同じ問題が発生しました。解決策は使用でした
runOnUiThread(new Runnable() {
public void run(){
}
});
runOnUiThreadはActivityメソッドであるため、後でJNIから呼び出すパブリック静的メソッドを呼び出せるように、アクティビティインスタンスをパブリック静的にする必要があります。
これが他の人を助けることを願っています:)
PS:ここからJNIの使い方を学びます http://www.cocos2d-x.org/projects/cocos2d-x/wiki/How_to_use_jni for my Android以前にcocos2dxで作られたゲーム
この行がエラーの原因だと思います。
imageView.setImageDrawable(createDrawableFromURL("http://savagelook.com/misc/sl_drop2.png"));
そしてエラーはそれがそうである理由を説明しています。
Only the original thread that created a view hierarchy can touch its views.
このエラーは、メインスレッドのユーザーインターフェイスを他のスレッドから変更しようとしているために発生します。ここではdoInBackground ...
このジョブをフラグメントで実行したい場合は、フラグメントのアクティビティからUIスレッドを呼び出す必要があります。
getActivity().runOnUiThread(new Runnable() {
public void run(){
... //your job
}
});
@canerkaseler