2010-08-23 2 views
2

В моем приложении есть виджеты с ImageView и TextView. О методе OnUpdate() из WidgetProvider, я положил Bitmap внутри ImageView таким образом:RuntimeException у виджета с растровым изображением (Android)

Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.widget_btn); 
Bitmap bitmap2 = BitmapManager.setColor(bitmap, red, green, blue); 
views.setImageViewBitmap(R.id.image, bitmap2); 

SetColor() Метод заключается в следующем:

public synchronized static Bitmap setColor(Bitmap org, float r, float g, float b) 
{ 
    sColorMatrix.setScale(r, g, b, 1); 
    sColorPaint.setColorFilter(new ColorMatrixColorFilter(sColorMatrix)); 
    // RGB_565 is faster, but loses transparency 
    Bitmap ret = Bitmap.createBitmap(org.getWidth(), org.getHeight(), Bitmap.Config.ARGB_8888); 
    try{ 
     sColorCanvas.setBitmap(ret); 
     //sColorCanvas.drawColor(Color.); 
     sColorCanvas.drawBitmap(org, 0, 0, sColorPaint); 
    } catch (Throwable t){ 

    } 

    return ret; 
} 

Проблема в том, что иногда виджет бросает RuntimeException, потому что кто-то переработал Bitmap, и я не знаю, что делать. Некоторые предложения?

Я могу приложить стек, если это может быть полезно. Спасибо!


Это StackTrace:

java.lang.RuntimeException: Canvas: trying to use a recycled bitmap [email protected] 
    at android.graphics.Canvas.throwIfRecycled(Canvas.java:955) 
    at android.graphics.Canvas.drawBitmap(Canvas.java:1044) 
    at android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:323) 
    at android.widget.ImageView.onDraw(ImageView.java:923) 
    at android.view.View.draw(View.java:6739) 
    at android.view.ViewGroup.drawChild(ViewGroup.java:1648) 
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1375) 
    at android.view.ViewGroup.drawChild(ViewGroup.java:1646) 
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1375) 
    at android.view.ViewGroup.drawChild(ViewGroup.java:1646) 
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1375) 
    at android.widget.AbsListView.dispatchDraw(AbsListView.java:1365) 
    at android.widget.ListView.dispatchDraw(ListView.java:3046) 
    at android.view.View.draw(View.java:6845) 
    at android.widget.AbsListView.draw(AbsListView.java:2257) 
    at android.view.ViewGroup.drawChild(ViewGroup.java:1648) 
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1375) 
    at android.view.ViewGroup.drawChild(ViewGroup.java:1646) 
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1375) 
    at android.view.View.draw(View.java:6742) 
    at android.widget.FrameLayout.draw(FrameLayout.java:352) 
    at android.view.ViewGroup.drawChild(ViewGroup.java:1648) 
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1375) 
    at android.view.ViewGroup.drawChild(ViewGroup.java:1646) 
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1375) 
    at android.view.ViewGroup.drawChild(ViewGroup.java:1646) 
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1375) 
    at android.view.ViewGroup.drawChild(ViewGroup.java:1646) 
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1375) 
    at android.view.ViewGroup.drawChild(ViewGroup.java:1646) 
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1375) 
    at android.view.View.draw(View.java:6742) 
    at android.widget.FrameLayout.draw(FrameLayout.java:352) 
    at android.view.ViewGroup.drawChild(ViewGroup.java:1648) 
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1375) 
    at android.view.View.draw(View.java:6742) 
    at android.widget.FrameLayout.draw(FrameLayout.java:352) 
    at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1872) 
    at android.view.ViewRoot.draw(ViewRoot.java:1422) 
    at android.view.ViewRoot.performTraversals(ViewRoot.java:1167) 
    at android.view.ViewRoot.handleMessage(ViewRoot.java:1744) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:144) 
    at android.app.ActivityThread.main(ActivityThread.java:4937) 
    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) 

ответ

0

Решение удалить все вызовы Bitmap#recycle из вашего кода. Сборщик мусора позаботится о необоснованных растровых изображениях.

+0

Привет, я не называл recycle() на любой части моего кода, это любопытная вещь ... Спасибо! – gskbyte

+0

Это очень странно. 'recycle' должен быть явно вызван. Я не вижу ничего, что выпрыгивает на меня, когда я нахожусь в иерархии вызовов. – Qberticus

+0

Если утилизация удалена, это может вызвать проблемы с памятью. – Namratha

0

Похоже, что битмап2 выходит из сферы действия GC, затем, когда настало время рисовать, оно исчезло.

Сделать bitmap2 статическим полем. Это должно прекратить его сбор до тех пор, пока не будет уничтожен содержащийся класс.