여기 몇 가지 답변을 살펴 봤지만 모두 다른 것들을 묻습니다. 결과적으로 아래 코드를 작성했습니다. AsyncTask를 사용하여 JSON을 구문 분석하면 두 곳에서 액세스 할 수 있습니다. doInBackground()의 끝; 및 onPostExecute(); JSON 구문 분석에서 가져온 URL의 이미지 뷰로 이미지를로드하는 방법은 무엇입니까?
나는 모두에 다음 코드를 시도하고 두 개의 서로 다른 오류를 가지고 :코드 :
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가있다. 내가 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를 사용하는 것입니다.하지만 그건 분명히 쓸모가 없습니다.
아이디어가 있으십니까? 비동기 적으로 수행 된 파싱 된 데이터 세트에서 이미지가 나타나게하려면 어떻게해야합니까?
아무도 알아보세요. 감사.
그럼 이제 내 onPostExecute에서이 문제를 해결할 수 있으며 작동할까요? Image URL을 모른다. JSON에서 호출 한 문자열에있다. –
onPostExecute()에서 이것을 호출 할 필요가 없습니다. Json의 yur image URL을 가져 와서 Android Query에 전달하면됩니다. 이미지를 다운로드하고 표시합니다. –
잠깐, 이해가 안되네. onPostExecute에서 나머지 JSON 데이터를 TextViews에 저장합니다. 그것은 내 AsyncTask 어딘가에 있어야합니다. 왜냐하면 thats는 내가 문자열의 형태로 imageurl에 액세스 할 수있는 유일한 장소이기 때문입니다. –