【问题标题】:RejectedExecutionException when loading bitmaps for ListView with asyncTask使用 asyncTask 为 ListView 加载位图时出现 RejectedExecutionException
【发布时间】:2014-07-02 12:33:37
【问题描述】:

我正在尝试使用按需生成的位图创建一个 ListView。我正在使用https://github.com/chrisbanes/Android-BitmapCache 缓存位图

我正在使用 SimpleAdapter,这个:

setViewBinder(new SimpleAdapter.ViewBinder() {
 @Override
 public boolean setViewValue(View view, Object object,String string) {
     if( string.startsWith("ClassName:") ){
         final ImageView yourImageView=(ImageView) view;
         AsyncTask<String, Void, Bitmap> imageLoadAsyncTask = new AsyncTask<String, Void, Bitmap>() {
             String cname;
             @Override
             protected Bitmap doInBackground(String... classnames) {
                 cname=classnames[0];
                 return db.getCharIcon(classnames[0]);
             }

             @Override
             protected void onPostExecute(Bitmap bitmap) {
                 yourImageView.setImageBitmap(bitmap);
             }
         };
         imageLoadAsyncTask.execute(string.substring(TextUtils.getTrimmedLength("ClassName:")));
         return true;
     }
     return false;
    }
}

getCharIcon 函数在这里:

Bitmap getCharIcon(String classname){
    Bitmap modBmp;
    CacheableBitmapDrawable cacheBmp=mCache.get(classname);
    if(cacheBmp==null)
    {
        modBmp=createCharIcon(classname);
        mCache.put(classname,modBmp);
    }
    else
    {
        modBmp=cacheBmp.getBitmap();
    }
    return modBmp;
}

createCharIcon 以这种方式生成位图的位置(我还没有实现选择图像好的部分的最终版本):

Bitmap createCharIcon(String classname)
{
    Bitmap modBmp = Bitmap.createBitmap(srcBmp,0,0,60,60);
    return modBmp;
}

很遗憾我收到了这个错误:

07-02 14:13:04.248  11592-11592/com.lectem.gecharacters E/AndroidRuntime﹕ FATAL EXCEPTION: main
    java.util.concurrent.RejectedExecutionException
            at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:1876)
            at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:774)
            at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1295)
            at android.os.AsyncTask.execute(AsyncTask.java:394)
            at com.lectem.gecharacters.CharFragment$1.setViewValue(CharFragment.java:110)
            at android.widget.SimpleAdapter.bindView(SimpleAdapter.java:168)
            at android.widget.SimpleAdapter.createViewFromResource(SimpleAdapter.java:126)
            at android.widget.SimpleAdapter.getView(SimpleAdapter.java:114)
            at android.widget.AbsListView.obtainView(AbsListView.java:1294)
            at android.widget.ListView.makeAndAddView(ListView.java:1730)
            at android.widget.ListView.fillDown(ListView.java:655)
            at android.widget.ListView.fillSpecific(ListView.java:1287)
            at android.widget.ListView.layoutChildren(ListView.java:1573)
            at android.widget.AbsListView.onLayout(AbsListView.java:1147)
            at android.view.View.layout(View.java:7035)
            at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
            at android.view.View.layout(View.java:7035)
            at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
            at android.view.View.layout(View.java:7035)
            at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1252)
            at android.widget.LinearLayout.layoutHorizontal(LinearLayout.java:1241)
            at android.widget.LinearLayout.onLayout(LinearLayout.java:1047)
            at android.view.View.layout(View.java:7035)
            at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
            at android.view.View.layout(View.java:7035)
            at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1252)
            at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1128)
            at android.widget.LinearLayout.onLayout(LinearLayout.java:1045)
            at android.view.View.layout(View.java:7035)
            at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
            at android.view.View.layout(View.java:7035)
            at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
            at android.view.View.layout(View.java:7035)
            at android.view.ViewRoot.performTraversals(ViewRoot.java:1045)
            at android.view.ViewRoot.handleMessage(ViewRoot.java:1727)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:123)
            at android.app.ActivityThread.main(ActivityThread.java:4627)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:521)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
            at dalvik.system.NativeStart.main(Native Method)

当我将列表向后滚动太快时出现此错误,因此我认为它与我可以使用的 asyncTask 数量相关... 我真的不确定我是否应该这样做,但是库 bitmapLruCache 需要在主线程之外的其他东西上运行。

【问题讨论】:

    标签: java android android-listview android-asynctask android-bitmap


    【解决方案1】:

    通常,该错误意味着您尝试一次使用太多AsyncTasks。在 AdapterView 中,如果您为每个项目(例如,ListView 中的每一行)分叉一个 AsyncTask 而不考虑行回收,并且用户丢弃列表,则可能会发生这种情况。

    引用the library's documentation:

    如果您希望库和回收功能发挥作用,您必须尽可能使用捆绑的 CacheableImageView。

    由于您似乎在 AdapterView 中使用它,请确保您使用的是 CacheableImageView

    【讨论】:

    • 这似乎是正确的做法,但如果我改变最终的 ImageView yourImageView=(ImageView) view;到最终的 CacheableImageView yourImageView=(CacheableImageView) 视图;它抛出异常 java.lang.ClassCastException: android.widget.ImageView
    • @Lectem:您还需要更改布局,或者在创建ImageView 的任何位置,以使用CacheableImageView。或者,切换到像 Picasso 这样不需要自定义 ImageView 类来处理这种情况的库。
    • 我确实尝试过更改布局,但我收到一个错误,因为它无法识别...我想我会简单地停用磁盘缓存。我确实看过毕加索,但将它用于我的目的似乎有点困难。也许我应该仔细看看......
    • @Lectem:“我收到一个错误,因为它无法识别”——确保您完全限定了 XML 元素中的类名 (&lt;uk.co.senab.bitmapcache.CacheableImageView&gt;)。
    • 似乎工作正常,但我仍然收到 RejectedExecutionException。我负担得起不使用磁盘缓存,但找到解决方案会很有趣
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-05
    • 2012-07-20
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多