Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android異步加載全解析之開篇瞎扯淡

Android異步加載全解析之開篇瞎扯淡

編輯:關於Android編程

Android異步加載

概述

Android異步加載在Android中使用的非常廣泛,除了是因為避免在主線程中做網絡操作,更是為了避免在顯示時由於時間太長而造成ANR,增加顯示的流暢性,特別是像ListView、GridView這樣的控件,如果getView的時間太長,就會造成非常嚴重的卡頓,非常影響性能。
本系列將展示在Android中如何進行異步加載操作,並使用ListView來作為演示的對象。

如何下載圖像

下載自然是需要使用網絡,使用網絡就不能在主線程,在主線程就會爆炸。所以我們必須要在非主線程中去下載圖像。OK,那麼下載使用的方法呢,非常多,這裡簡單的列舉幾種

HttpURLConnection

private static Bitmap getBitmapFromUrl(String urlString) {
    Bitmap bitmap;
    InputStream is = null;
    try {
        URL url = new URL(urlString);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        is = new BufferedInputStream(conn.getInputStream());
        bitmap = BitmapFactory.decodeStream(is);
        conn.disconnect();
        return bitmap;
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            if (is != null)
                is.close();
        } catch (IOException e) {
        }
    }
    return null;
}

非常簡單,甚至都沒做超時等處理,這裡偷個懶。

Drawable

Drawable d = Drawable.createFromStream(is, url);

也非常簡單,只是需要進行下轉換。

ListView

這一篇作為開篇,我們還是來扯下淡,這個ListView,大家都用過,最常用的優化也就是使用ViewHolder模式進行復用,避免重復的inflate和findViewById而影響效率,相信大部分的開發者都已經熟知,這裡我們還是貼下Adapter的代碼:
package com.imooc.listviewacyncloader;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;

import java.util.List;

public class MyAdapterNotUseCaches extends BaseAdapter {

    private LayoutInflater mInflater;
    private List mData;

    public MyAdapterNotUseCaches(Context context, List data) {
        this.mData = data;
        mInflater = LayoutInflater.from(context);
    }

    @Override
    public int getCount() {
        return mData.size();
    }

    @Override
    public Object getItem(int position) {
        return mData.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        String url = mData.get(position);
        ViewHolder viewHolder = null;
        if (convertView == null) {
            viewHolder = new ViewHolder();
            convertView = mInflater.inflate(R.layout.listview_item, null);
            viewHolder.imageView = (ImageView) convertView.findViewById(R.id.iv_lv_item);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        viewHolder.imageView.setTag(url);
        viewHolder.imageView.setImageResource(R.drawable.ic_launcher);
        return convertView;
    }

    public class ViewHolder{
        public ImageView imageView;
    }
}

確實非常簡單哈,最基本的ViewHolder模式使用ListView,不過,這裡有點需要注意的:
viewHolder.imageView.setTag(url);

這個其實是非常重要的,為什麼重要我們後面會繼續說。除了這個地方,其它的部分,如果你能獨立寫出來,相信你已經擊敗了10%的開發者了,後面我們再來講如何擊敗剩下90%的開發者。

圖像

圖像我們可以從網絡相冊裡面來獲取,這裡偶然找到郭神的一篇博客裡面的圖像地址,就無恥的拿來用了:
public class Images {

    public final static String[] IMAGE_URLS = new String[] {
            http://img.my.csdn.net/uploads/201407/26/1406383299_1976.jpg,
            http://img.my.csdn.net/uploads/201407/26/1406383291_6518.jpg,
            http://img.my.csdn.net/uploads/201407/26/1406383291_8239.jpg,
            http://img.my.csdn.net/uploads/201407/26/1406383290_9329.jpg,
            http://img.my.csdn.net/uploads/201407/26/1406383290_1042.jpg,
            http://img.my.csdn.net/uploads/201407/26/1406383275_3977.jpg,
            http://img.my.csdn.net/uploads/201407/26/1406383265_8550.jpg,
……
那麼我們在MainActivity中就可以導入這些圖像了:
package com.imooc.listviewacyncloader;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;

import java.util.Arrays;
import java.util.List;


public class MainActivity extends Activity {

    private ListView mListView;
    private List mData;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mListView = (ListView) findViewById(R.id.lv);
        mData = Arrays.asList(Images.IMAGE_URLS);
        mListView.setAdapter(……);
    }
}

測試圖像搞定~我們後面繼續~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


 






  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved