ここでいくつかの回答を見てきましたが、それらはすべて異なることを求めています。その結果、以下のコードを思いつきました。2 つの場所でアクセスできる AsyncTask を使用して JSON を解析します。doInBackground(); の終わり。および onPostExecute();
両方で次のコードを試したところ、2 つの異なるエラーが発生しました。
コード:
try {
ImageView one = (ImageView)findViewById(R.id.one);
String getImage = bookDet.get(0).image;
Bitmap bitmap = BitmapFactory.decodeStream((InputStream)new URL(getImage).getContent());
one.setImageBitmap(bitmap);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
BookDet は、データを保持する ArrayList であり、文字列に変換されてそこに配置されています。
doInBackground() を試したときのエラー:
E/AndroidRuntime(14007): FATAL EXCEPTION: AsyncTask #2
E/AndroidRuntime(14007): java.lang.RuntimeException: An error occured while executing doInBackground()
E/AndroidRuntime(14007): at android.os.AsyncTask$3.done(AsyncTask.java:299)
E/AndroidRuntime(14007): at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
E/AndroidRuntime(14007): at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
E/AndroidRuntime(14007): at java.util.concurrent.FutureTask.run(FutureTask.java:239)
E/AndroidRuntime(14007): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
E/AndroidRuntime(14007): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
E/AndroidRuntime(14007): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
E/AndroidRuntime(14007): at java.lang.Thread.run(Thread.java:856)
E/AndroidRuntime(14007): Caused by: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
これはほんの一部ですが、最後の行が鍵のようです。AsyncTask は 1 つしかありません。
onPostExecute で実行するとエラーが発生します:
E/AndroidRuntime(16801): FATAL EXCEPTION: main
E/AndroidRuntime(16801): android.os.NetworkOnMainThreadException
E/AndroidRuntime(16801): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117)
E/AndroidRuntime(16801): at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
E/AndroidRuntime(16801): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
E/AndroidRuntime(16801): at java.net.InetAddress.getAllByName(InetAddress.java:214)
E/AndroidRuntime(16801): at libcore.net.http.HttpConnection.<init>(HttpConnection.java:70)
E/AndroidRuntime(16801): at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
E/AndroidRuntime(16801): at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:340)
E/AndroidRuntime(16801): at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87)
E/AndroidRuntime(16801): at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
E/AndroidRuntime(16801): at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:316)
E/AndroidRuntime(16801): at libcore.net.http.HttpEngine.connect(HttpEngine.java:311)
E/AndroidRuntime(16801): at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:290)
E/AndroidRuntime(16801): at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:240)
E/AndroidRuntime(16801): at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:81)
E/AndroidRuntime(16801): at java.net.URLConnection.getContent(URLConnection.java:190)
E/AndroidRuntime(16801): at java.net.URL.getContent(URL.java:447)
メインスレッドではできないので…?
現時点で私ができる最善のことは、その URL を文字列にプルする TextView を用意することです。これは問題なく表示されますが、明らかに役に立ちません。
何か案は?非同期で行われた解析済みデータ セットから画像を表示するにはどうすればよいですか?
誰の助けにも感謝します。ありがとう。