2012-07-20 75 views
4

它是不好的做法,呼籲你能安全地調用「getDrawable」或「decodeResource」在UI線程中的Android

getResources().getDrawable()BitmapFactory.decodeResource()

從Android的UI線程?我只是想知道,因爲我有這種情況,當我執行後臺操作時,我想在我的視圖中顯示一個調整圖像,但是我仍然調用以上任一方法...幾乎每個項目我都會執行任何線程上的任何方法都沒有第二想法,但我只是在尋找最佳實踐。

回答

0

如果您在UI線程上執行任何GUI更新,這將是一種很好的做法。在任何線程內,你都可以運行你的UI線程,在那裏你可以做UI的東西,否則你可以去消息處理程序也可以爲你做同樣的事情。

Runnable run_in_ui = new Runnable() { 
     @Override 
     public void run() { 
      // do your UI stuffs here 
     } 
    }; 
    runOnUiThread(run_in_ui); 
+0

是的,我知道它的最佳實踐來更新UI線程上的UI組件。我更感興趣知道getDrawable()和decodeResource()在UI線程上是否被認爲是「I/O」?或者如果他們應該始終在工作線程上完成? – 2012-07-20 18:45:39

1

快進3年以來我問這個問題,我覺得的答案是「只要用畢加索或滑翔」。我認爲答案是「這取決於」。它取決於圖像/繪圖的大小。對於BitmapFactory#decodeResource,您應該盡一切所能保持主線程不變。如果我試圖展示佔位符圖像,最佳做法是應該將它包裝在您的應用中,並且尺寸合理,並與您的設計相符。

0

即使Vijay Sharma建議使用畢加索,我建議你使用Facebook上的frescolib。它從硬件緩存開始進行所有可能的優化,最終通過流水線概念修改Http請求。

而是做你自己的,最好是依靠Facebook的團隊的工作:

的build.gradle:

dependencies { 
    // your app's other dependencies 
    compile 'com.facebook.fresco:fresco:0.7.0+' 
} 

view.xml用:

<com.facebook.drawee.view.SimpleDraweeView 
    android:id="@+id/my_image_view" 
    android:layout_width="20dp" 
    android:layout_height="wrap_content" 
    fresco:viewAspectRatio="1.33" 
    <!-- other attributes --> 

的java:

mSimpleDraweeView.setImageURI(uri); 

T帽子簡單!

+0

是的,壁畫也。我只是想表達一下,我認爲使用圖書館和自己做這件事是最好的選擇。 – 2015-10-07 23:41:46