2012-12-13 28 views
3

在使用SO解決我的問題一年後,我遇到了一個我找不到解決方案的問題。配置更改後忽略view.invalidate()

我正在使用多個線程來計算位圖。當計算新的位圖行時,我更新自定義視圖並調用invalidate()。但是當我旋轉手機時,位圖停止更新。在另一個屏幕旋轉後,View只更新一次,同時計算出的一部分位圖也是可見的。 onCreate方法的

部分:

 view = (MyView) findViewById(R.id.view1); 

    if (savedInstanceState != null) 
    { 
     bitmap = savedInstanceState.getParcelable("bitmap"); 
     view.bitmap = bitmap; 
    } 
    else 
    { 
     bitmap = Bitmap.createBitmap(400, 500, Bitmap.Config.ARGB_8888); 
     bitmap.eraseColor(Color.GRAY); 
     view.bitmap = bitmap; 
    } 

我用handler來更新我的觀點:

 public void handleMessage(final Message msg) { 

     Log.i("Recieved", "redraw signal"); 
     view.bitmap = bitmap; 
     view.invalidate(); 
    } 

在我看來,我使用:

 Bitmap bitmap; 
    Rect rect; 

    //...constructors 

    @Override 
    protected void onSizeChanged (int w, int h, int oldw, int oldh) 
    { 
     rect = new Rect(0, 0, getWidth(), getHeight()); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) 
    { 
     super.onDraw(canvas); 
     if (bitmap!=null) 
     {    
      canvas.drawBitmap(bitmap, null, rect, null); 
     } 
     Log.i("onDraw", "draw"); 
    } 

解決方案

到目前爲止,我找到了一個解決方案。如果我在onDraw的末尾添加invalidate(),則在屏幕方向更改後,位圖會被更新(逐行)。我不認爲這是非常「乾淨」的解決方案,所以我想了解爲什麼配置更改後忽略handler忽略invalidate()

謝謝!

+1

由於無效電話的onDraw你不應該調用內部的onDraw – Blackbelt

+0

我同意無效,但到目前爲止,這是唯一的我有解決方案。 –

回答

1

我找到了解決方案。

問題出在Handler中,它不是靜態的。我忽略了「可能發生泄漏」警告,因爲我沒有發佈長時間的延遲消息。大錯,因爲在配置更改後Handler無法訪問View。

這裏是解決方案:

static class MyHandler extends Handler { 
    private final WeakReference<MainActivity> mTarget; 

    public MyHandler(MainActivity target) { 
     mTarget = new WeakReference<MainActivity>(target); 

    } 

    @Override 
    public void handleMessage(Message msg) { 
     MainActivity target = mTarget.get(); 
...other stuff... 
     target.view.invalidate(); // now this works after configuration change 

    } 

} 

底線:使用靜態處理程序,如解釋here