編輯:Android開發教程
研究了android從網絡上異步加載圖像,現總結如下:
(1)由於android UI更新支持單一線程原則,所以從網絡上取數據並更新到界面上,為了不阻塞主線程首先可能會想到以下方法。
在主線程中new 一個Handler對象,加載圖像方法如下所示
private void loadImage(final String url, final int id) {
handler.post(new Runnable() {
public void run() {
Drawable drawable = null;
try {
drawable = Drawable.createFromStream(new URL(url).openStream(), "image.png");
} catch (IOException e) {
}
((ImageView) LazyLoadImageActivity.this.findViewById(id)).setImageDrawable(drawable);
}
});
}
上面這個方法缺點很顯然,經測試,如果要加載多個圖片,這並不能實現異步加載,而是等到所有的圖片都加載完才一起顯示,因為它們都運行在一個線程中。
然後,我們可以簡單改進下,將Handler+Runnable模式改為Handler+Thread+Message模式不就能實現同時開啟多個線程嗎?
(2)在主線程中new 一個Handler對象,代碼如下:
final Handler handler2=new Handler(){
@Override
public void handleMessage(Message msg) {
((ImageView) LazyLoadImageActivity.this.findViewById(msg.arg1)).setImageDrawable((Drawable)msg.obj);
}
};
對應加載圖像代碼如下:
//采用handler+Thread模式實現多線程異步加載
private void loadImage2(final String url, final int id) {
Thread thread = new Thread(){
@Override
public void run() {
Drawable drawable = null;
try {
drawable = Drawable.createFromStream(new URL(url).openStream(), "image.png");
} catch (IOException e) {
}
Message message= handler2.obtainMessage() ;
message.arg1 = id;
message.obj = drawable;
handler2.sendMessage(message);
}
};
thread.start();
thread = null;
}
這樣就簡單實現了異步加載了。細想一下,還可以優化的,比如引入線程池、引入緩存等,我們先介紹線程池。
(3)引入ExecutorService接口,於是代碼可以優化如下:
在主線程中加入:private ExecutorService executorService = Executors.newFixedThreadPool(5);
對應加載圖像方法更改如下:
// 引入線程池來管理多線程
private void loadImage3(final String url, final int id) {
executorService.submit(new Runnable() {
public void run() {
try {
final Drawable drawable = Drawable.createFromStream(new URL(url).openStream(), "image.png");
handler.post(new Runnable() {
public void run() {
((ImageView) LazyLoadImageActivity.this.findViewById(id)).setImageDrawable(drawable);
}
});
} catch (Exception e) {
throw new RuntimeException(e);
}
}
});
}
Android LibGDX游戲引擎開發教程(三) 示例代碼詳細講解
承接了上一篇文章中關於環境搭建的簡單示例,這一篇我會詳細講解FirstGame和HelloGameActivity類中 的代碼。一、ApplicationListener
Android測試教程(5):第一個測試項目HelloWorldTest
本例介紹創建一個測試項目的一般步驟和編寫測試用例的基本方法。為簡單起見,創建一個HelloWorld應用,帶有一 個Greeting類,其定義如下:public clas
Android開發入門(一)詳解活動 1.6 顯示復雜對話框
除了“對話框”進度條,也可以創建一個顯示“操作進度”的對話框,例如顯示正在下載的狀態。1. 創建一個工程:Dialog。2
Android和iOS平台碎片化比較
Android系統的分銷模式注定帶來了碎片化問題,廠商可以按照自己的市場定位和運營商特殊需求來定制自己的設備,這就導致了Android平台凌亂的分辨率和版本分布。今天Fo