2013-03-12 54 views
0

我正在嘗試開發可應用現有圖像的一些基本效果的應用程序。我和它差不多都是O.K。但是當我玩像素時,它停止了工作。有人可以幫我解決嗎?我應該使用另一個線程而不是主線程來編寫下面的代碼嗎?將圖像轉換爲灰度圖像時,應用程序未響應

  int[] imagePixels = new int[picWidth * picHeight]; 
     bitmap.getPixels(imagePixels, 0, picWidth, 0, 0, picWidth, picHeight); 


     for (int y = 0; y < picHeight; y++) { 

      for (int x = 0; x < picWidth; x++) { 

       int index = y * picWidth + x; 
       int red = (imagePixels[index] >> 16) & 0xff;  
       int green = (imagePixels[index] >> 8) & 0xff; 
       int blue = imagePixels[index] & 0xff; 

       red = (int) Math.abs(red-255); 
       green = (int) Math.abs(green-255); 
       blue = (int) Math.abs(blue-255); 

       imagePixles[index] = 0xff000000 | (red << 16) | (green << 8) | blue; 

       } 
     } 
     bitmap.setPixels(imagePixels, 0, picWidth, 0, 0, picWidth, picHeight); 
+0

「停止工作」是什麼意思?請更加明確。 – Egor 2013-03-12 10:52:40

+0

我應該使用另一個線程而不是主線程來編寫下面的代碼嗎? >是的 – 2013-03-12 10:55:01

+0

@Egor Android對我說,我的應用程序沒有響應等待和取消兩個選項。 – user3430287 2013-03-12 11:07:25

回答

1

如果你正在編寫GUI代碼(AWT/Swing的/等)的第一條規則是什麼也不做,CPU在調度線程密集。

如果您對用戶輸入做出響應 - 例如點擊鼠標,觸摸或選擇菜單 - 並且您計劃執行一些處理時間較長的工作,請分開一個線程完成工作,並且當作業完成時將事件提交給事件隊列。

這種方式使用戶界面具有響應性,並且在您應用效果後要刷新顯示部分時,將響應用戶生成的事件和編程生成的事件。

這是任何UI編碼的一般建議,有人可能能夠添加更多關於Android特定功能的內容;我的猜測是,Android操作系統沒有得到它注入到事件處理隊列中的事件的響應,因此假定你的應用程序已經死了,實際上它還活着,只是忙於在派發線程中做些事情,不要。

希望有所幫助。

+0

Android中的+1我們有助手AsyncTask類(Thread + Handler)...但通常是 - true ... – Selvin 2013-03-12 11:37:22