В моем случае я использовал WebView для визуализации и отображения сведений о новостях, и я хочу обрабатывать загрузку и кеширование изображений самостоятельно, а не WebView. поэтому я использовал Пикассо для моих изображений Lib, как показано ниже:Как использовать WebView с Picasso?
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
if (!Utils.hasHoneycomb()||TextUtils.isEmpty(url)||url.startsWith("file://")) {
return super.shouldInterceptRequest(view, url);
}
if (!url.startsWith("http") || !url.endsWith(".jpg") || !url.endsWith(".jpeg") || !url.endsWith(".png")) {
return super.shouldInterceptRequest(view, url);
}
WebResourceResponse response = null;
try {
final PipedOutputStream out = new PipedOutputStream();
PipedInputStream in = new PipedInputStream(out);
Picasso.with(Application.getInstance()).load(url).into(new Target() {
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
if (bitmap != null) {
try {
out.write(StreamTool.bmp2ByteArray100(bitmap, false));
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
@Override
public void onBitmapFailed(Drawable errorDrawable) {
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
}
});
response = new WebResourceResponse("image/*", "UTF-8", in);
} catch (IOException e) {
e.printStackTrace();
}
return response;
}
, но он не работает, и я знаю shouldInterceptRequest работы в не-UI потоке, Picassso
throw new IllegalStateException("Method call should happen from the main thread.");
так у меня есть два вопросы:
- Каков общий способ обработки изображений и кеширования самостоятельно, а не WebView?
- Как использовать Picasso с основной резьбой?
ОБНОВЛЕНО (добавление стека исключений):
06-08 18:17:05.540 5137-6951/com.news.daily I/dalvikvm﹕ java.lang.IllegalStateException: Method call should happen from the main thread.
06-08 18:17:05.540 5137-6951/com.news.daily I/dalvikvm﹕ at com.squareup.picasso.Utils.checkMain(Utils.java:136)
06-08 18:17:05.540 5137-6951/com.news.daily I/dalvikvm﹕ at com.squareup.picasso.RequestCreator.into(RequestCreator.java:496)
06-08 18:17:05.540 5137-6951/com.news.daily I/dalvikvm﹕ at com.news.daily.widget.webview.WebViewClientDaily.shouldInterceptRequest(WebViewClientDaily.java:123)
06-08 18:17:05.550 5137-6951/com.news.daily I/dalvikvm﹕ at android.webkit.CallbackProxy.shouldInterceptRequest(CallbackProxy.java:1534)
06-08 18:17:05.550 5137-6951/com.news.daily I/dalvikvm﹕ at android.webkit.BrowserFrame.shouldInterceptRequest(BrowserFrame.java:972)
06-08 18:17:05.550 5137-6951/com.news.daily I/dalvikvm﹕ at android.webkit.WebSettingsClassic.nativeSync(Native Method)
06-08 18:17:05.550 5137-6951/com.news.daily I/dalvikvm﹕ at android.webkit.WebSettingsClassic.access$100(WebSettingsClassic.java:50)
06-08 18:17:05.550 5137-6951/com.news.daily I/dalvikvm﹕ at android.webkit.WebSettingsClassic$EventHandler$1.handleMessage(WebSettingsClassic.java:291)
06-08 18:17:05.550 5137-6951/com.news.daily I/dalvikvm﹕ at android.os.Handler.dispatchMessage(Handler.java:99)
06-08 18:17:05.550 5137-6951/com.news.daily I/dalvikvm﹕ at android.os.Looper.loop(Looper.java:137)
06-08 18:17:05.550 5137-6951/com.news.daily I/dalvikvm﹕ at android.webkit.WebViewCore$WebCoreThread.run(WebViewCore.java:1092)
06-08 18:17:05.550 5137-6951/com.news.daily I/dalvikvm﹕ at java.lang.Thread.run(Thread.java:841)
06-08 18:17:05.550 5137-6951/com.news.daily I/dalvikvm﹕ DALVIK THREADS:
06-08 18:17:05.550 5137-6951/com.news.daily I/dalvikvm﹕ (mutexes: tll=0 tsl=0 tscl=0 ghl=0)
06-08 18:17:05.550 5137-6951/com.news.daily I/dalvikvm﹕ "main" prio=5 tid=1 NATIVE
06-08 18:17:05.550 5137-6951/com.news.daily I/dalvikvm﹕ | group="main" sCount=0 dsCount=0 obj=0x419dc710 self=0x419c60f0
06-08 18:17:05.550 5137-6951/com.news.daily I/dalvikvm﹕ | sysTid=5137 nice=0 sched=0/0 cgrp=apps handle=1074810876
06-08 18:17:05.550 5137-6951/com.news.daily I/dalvikvm﹕ | state=S schedstat=(3242900256 1453466203 12922) utm=238 stm=86 core=3
06-08 18:17:05.560 5137-6951/com.news.daily I/dalvikvm﹕ #00 pc 0001c6ec /system/lib/libc.so (epoll_wait+12)
06-08 18:17:05.560 5137-6951/com.news.daily I/dalvikvm﹕ #01 pc 000153f1 /system/lib/libutils.so (android::Looper::pollInner(int)+92)
06-08 18:17:05.560 5137-6951/com.news.daily I/dalvikvm﹕ #02 pc 00015615 /system/lib/libutils.so (android::Looper::pollOnce(int, int*, int*, void**)+92)
06-08 18:17:05.560 5137-6951/com.news.daily I/dalvikvm﹕ #03 pc 000729ed /system/lib/libandroid_runtime.so (android::NativeMessageQueue::pollOnce(_JNIEnv*, int)+22)
06-08 18:17:05.560 5137-6951/com.news.daily I/dalvikvm﹕ #04 pc 00020c0c /system/lib/libdvm.so (dvmPlatformInvoke+112)
06-08 18:17:05.560 5137-6951/com.news.daily I/dalvikvm﹕ #05 pc 0005178b /system/lib/libdvm.so (dvmCallJNIMethod(unsigned int const*, JValue*, Method const*, Thread*)+398)
06-08 18:17:05.560 5137-6951/com.news.daily I/dalvikvm﹕ #06 pc 00000214 /dev/ashmem/dalvik-jit-code-cache (deleted)
06-08 18:17:05.560 5137-6951/com.news.daily I/dalvikvm﹕ at android.os.MessageQueue.nativePollOnce(Native Method)
06-08 18:17:05.560 5137-6951/com.news.daily I/dalvikvm﹕ at android.os.MessageQueue.next(MessageQueue.java:132)
06-08 18:17:05.560 5137-6951/com.news.daily I/dalvikvm﹕ at android.os.Looper.loop(Looper.java:124)
06-08 18:17:05.560 5137-6951/com.news.daily I/dalvikvm﹕ at android.app.ActivityThread.main(ActivityThread.java:5450)
06-08 18:17:05.560 5137-6951/com.news.daily I/dalvikvm﹕ at java.lang.reflect.Method.invokeNative(Native Method)
06-08 18:17:05.560 5137-6951/com.news.daily I/dalvikvm﹕ at java.lang.reflect.Method.invoke(Method.java:525)
06-08 18:17:05.560 5137-6951/com.news.daily I/dalvikvm﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1187)
06-08 18:17:05.560 5137-6951/com.news.daily I/dalvikvm﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
06-08 18:17:05.560 5137-6951/com.news.daily I/dalvikvm﹕ at dalvik.system.NativeStart.main(Native Method)
06-08 18:17:05.560 5137-6951/com.news.daily I/dalvikvm﹕ [ 06-08 18:17:05.560 5137: 6951 I/dalvikvm ]
"AsyncTask #10" prio=5 tid=41 WAIT
Вместо стека сообщений IllegalStateException с источником исключения (строка и т. Д.) – dasar
@dasar я добавил стек исключений, thx. – Xiaozou
Почему вы не просите Пикассо загружать изображения в нити ui? Он сделает запросы в фоновом режиме для вас ... Вы занимаетесь? –