2012-04-24 19 views
0

我的應用程序有一個包含一些ImageButtons的佈局。另外,我的應用程序呈現一些位圖供以後使用。位圖通過創建帶有位圖參數的畫布,然後繪製到畫布來呈現。該位圖渲染任務發生在非UI線程中,因此gui在位圖渲染時可以保持響應。Android:在非UI線程中繪製到畫布引起的同步問題?

正在發生ANR。造成的原因似乎是ImageButton.draw()方法沒有完成。此外,看起來該方法無法完成,因爲Bitmap渲染任務在ImageButton繪製時開始渲染。

下面是一些代碼片段,日誌輸出和ANR中的traces.txt文件。

我的結論是否可能/在非UI線程中畫Canvas可能會導致ImageButton.draw()掛起?如果是這樣,任何建議來解決這個問題?

private class BitmapRenderTask implements Runnable 
{ 
    ...  
    public void run() 
    { 
     Log.e("start render task", rect.toString()); 
     ... 
     Canvas canvas = new Canvas(bitmap); 
     Log.e("created canvas", "created canvas"); 
     //do stuff to draw into canvas 
     Log.e("drew to canvas", "drew to canvas"); 
     ... 
     Log.e("done, exit", rect.toString()); 

public class MyImageButton extends ImageButton 
{ 
    public void draw(Canvas canvas) 
    { 
     Log.e("start drawing", this.toString()); 
     super.draw(canvas); 
     Log.e("end drawing", this.toString()); 
    } 
} 

My log: 

04-24 14:10:12.115: E/start render task(9446): 1 Rect(512, 0 - 800, 512) 
04-24 14:10:12.230: E/start drawing(9446): MyButton1 
04-24 14:10:12.230: E/end drawing(9446): MyButton1 
04-24 14:10:12.230: E/start drawing(9446): MyButton2 
04-24 14:10:12.230: E/end drawing(9446): MyButton2 
04-24 14:10:12.230: E/start drawing(9446): MyButton3 
04-24 14:10:12.230: E/end drawing(9446): MyButton3 
04-24 14:10:12.230: E/start drawing(9446): MyButton4 
04-24 14:10:12.235: E/end drawing(9446): MyButton4 
04-24 14:10:12.235: E/start drawing(9446): MyButton5 
04-24 14:10:12.235: E/end drawing(9446): MyButton5 
04-24 14:10:12.235: E/start drawing(9446): MyButton6 
04-24 14:10:12.390: E/drew to canvas(9446): drew to canvas 
04-24 14:10:12.395: E/done, exit(9446): Rect(512, 0 - 800, 512) 
04-24 14:10:12.395: E/start render task(9446): Rect(0, 1024 - 512, 1084) 
04-24 14:10:12.410: E/drew to canvas(9446): drew to canvas 
04-24 14:10:12.395: E/done, exit(9446): Rect(0, 1024 - 512, 1084) 

traces.txt:

http://pastebin.com/s98nEyYt

回答

0

如果繪圖是創建,例如啓動按鈕的一部分,由您setContentView(R.layout.screen);那麼很可能的是,代碼只是通過努力完成運行當你的按鈕(如果我理解正確)異步任務仍然呈現位圖。

我會嘗試以下方法:

  1. 只看到如果真的減慢你的IU,做這一切同步 - 沒有backgroudn異步任務。我有幾種情況下,複雜的用戶定義小部件創建 - 所有速度都不會有任何問題

  2. 用默認的簡單繪圖創建btn,並在準備好使用異步任務或任何其他後臺任務時填充耗時的備選項with handlers

告訴我們!