天天看點

離線下載下傳緩存圖檔

本部落客要用來說明,在安卓app開發過程中,離線下載下傳的圖檔如何緩存,其主要是運用imageloader來緩存圖檔

主要代碼如下

主acivity裡面的代碼

package com.example.load___;

import java.util.ArrayList;

import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.assist.FailReason;
import com.nostra13.universalimageloader.core.listener.ImageLoadingListener;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.view.View;
import android.widget.ListView;

public class MainActivity extends Activity {
    /**
     * 模拟接口裡的圖檔位址
     */
    String[] picPath1 = new String[] {

            "https://gw.alicdn.com/tps/TB133PFKpXXXXbIXFXXXXXXXXXX-520-280.jpg",
            "https://aecpm.alicdn.com/simba/img/TB1yWIyKXXXXXbwXXXXSutbFXXX.jpg",
            "https://img.alicdn.com/tps/TB1E_kqKpXXXXcGXXXXXXXXXXXX-520-280.jpg",
            "https://aecpm.alicdn.com/simba/img/TB1pKE2JVXXXXbpaXXXSutbFXXX.jpg",
            "https://img.alicdn.com/bao/uploaded/i1/TB1r5K.KpXXXXcyXpXXXXXXXXXX_!!0-item_pic.jpg_430x430q90.jpg",
            "https://img.alicdn.com/imgextra/i2/1062618758/TB25Q60qpXXXXXVXpXXXXXXXXXX_!!1062618758.jpg_60x60q90.jpg",
            "https://img.alicdn.com/imgextra/i2/1062618758/TB2sdDMqFXXXXcsXXXXXXXXXXXX_!!1062618758.jpg",
            "https://gw.alicdn.com/bao/uploaded/i7/63418204/TB2DHUkpVXXXXbsXXXXXXXXXXXX_!!63418204.jpg_280x380xz.jpg",
            "https://gw.alicdn.com/bao/uploaded/i8/380101244/TB2V3jSpVXXXXcKXXXXXXXXXXXX_!!380101244.jpg_280x380xz.jpg",
            "https://gw.alicdn.com/bao/uploaded/i4/43084091/TB2Oy7RoFXXXXcyXXXXXXXXXXXX_!!43084091.jpg_280x380xz.jpg",
            "https://gw.alicdn.com/bao/uploaded/i6/TB1enEaJVXXXXbhXFXXXXXXXXXX_!!0-item_pic.jpg_280x380xz.jpg",
            "https://gw.alicdn.com/bao/uploaded/i7/TB1YOmRJFXXXXc.aXXXYXGcGpXX_M2.SS2_280x380xz.jpg",
            "https://gw.alicdn.com/bao/uploaded/i0/TB1S9dLJFXXXXXVaXXXYXGcGpXX_M2.SS2_280x380xz.jpg",
            "https://gw.alicdn.com/bao/uploaded/i6/2115168470/TB2LGwsnFXXXXXKXFXXXXXXXXXX_!!2115168470.jpg_280x380xz.jpg",
            "https://gw.alicdn.com/bao/uploaded/i7/140750234460572075/TB1YQBMKpXXXXXLXXXXXXXXXXXX_!!0-pix.jpg_280x380xz.jpg",

    };
    private ListView listView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        listView = (ListView) findViewById(R.id.listView);
        // 如果有網用網絡資料,如果沒有就用資料庫的資料
        if (isNetWorkAvailable(this)) {


        } else {
            listView.setAdapter(new Myadapter(this,picPath1));

        }

    }

    // 離線下載下傳跳轉按鈕
    public void offline(View v) {

        startActivityForResult(new Intent(this, TypeActivity.class), );

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // TODO Auto-generated method stub
        super.onActivityResult(requestCode, resultCode, data);
        // 得到要離線下載下傳的資料類型
        ArrayList<String> list = data.getStringArrayListExtra("type");
        // 1.得到每個類型對應的接口位址
        // 2.通過請求每個接口位址,得到json資訊
        // 3.把json裡圖檔的位址拿到,并請求
        // 4.将json資訊存到資料庫
        // 
        for (String string : picPath1) {

            ImageLoader imageLoader = ImageLoader.getInstance();
            imageLoader.loadImage(string, new ImageLoadingListener() {

                @Override
                public void onLoadingStarted(String arg0, View arg1) {

                }

                @Override
                public void onLoadingFailed(String arg0, View arg1,
                        FailReason arg2) {

                }

                @Override
                public void onLoadingComplete(String arg0, View arg1,
                        Bitmap arg2) {

                }

                @Override
                public void onLoadingCancelled(String arg0, View arg1) {

                }
            });
        }

    }

    /**
     * 判斷網絡是否可用
     * 
     * @param context
     * @return
     */
    public boolean isNetWorkAvailable(Context context) {
        ConnectivityManager manager = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        if (manager != null) {
            NetworkInfo info = manager.getActiveNetworkInfo();
            if (info != null && info.isConnected()) {
                return true;
            } else {
                return false;
            }
        } else {
            return false;
        }
    }
}

下面這個是application,主要是對imageloader設定一個記憶體緩存政策
           

package com.example.load___;

import java.io.File;

import java.io.IOException;

import java.io.InputStream;

import com.nostra13.universalimageloader.cache.disc.DiskCache;

import com.nostra13.universalimageloader.cache.disc.impl.LimitedAgeDiskCache;

import com.nostra13.universalimageloader.cache.disc.impl.ext.LruDiskCache;

import com.nostra13.universalimageloader.cache.disc.naming.FileNameGenerator;

import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator;

import com.nostra13.universalimageloader.cache.memory.MemoryCache;

import com.nostra13.universalimageloader.cache.memory.impl.FIFOLimitedMemoryCache;

import com.nostra13.universalimageloader.cache.memory.impl.LargestLimitedMemoryCache;

import com.nostra13.universalimageloader.cache.memory.impl.LimitedAgeMemoryCache;

import com.nostra13.universalimageloader.cache.memory.impl.LruMemoryCache;

import com.nostra13.universalimageloader.cache.memory.impl.UsingFreqLimitedMemoryCache;

import com.nostra13.universalimageloader.core.ImageLoader;

import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;

import com.nostra13.universalimageloader.core.ImageLoaderConfiguration.Builder;

import com.nostra13.universalimageloader.core.download.ImageDownloader;

import android.app.Application;

import android.os.Environment;

import android.widget.Toast;

public class MyApplication extends Application {

private int maxMemory;

@Override
public void onCreate() {
    super.onCreate();
    System.out.println("MyApplication");

    maxMemory = ((int) Runtime.getRuntime().maxMemory()) / 1024 / 1024;
              System.out.println("最大記憶體:"+maxMemory);
              Toast.makeText(this, "   "+maxMemory, 0).show();

     //初始ImageLoader
    initImageLoader();


}

/**
 *           
     //初始ImageLoader
 */
@SuppressWarnings("deprecation")
private void initImageLoader() {


    //得到ImageLoader執行個體
    ImageLoader imageLoader=ImageLoader.getInstance();

    //得到ImageLoader配置的建築者對象
    ImageLoaderConfiguration.Builder builder=new Builder(this);

    //設定磁盤(sd卡)緩存的大小限制
           

// builder.diskCacheSize(maxCacheSize);

try {

// imageDownloader

//設定磁盤(sd卡)緩存政策,參數一:緩存檔案的路徑,參數二:檔案名的命名方法,有MD5,HashCode,參數三:緩存的最大記憶體

builder.discCache(new LruDiskCache(new File(Environment.getExternalStorageDirectory().getPath()+”/aaa”), new Md5FileNameGenerator(), 2*1024*1204));

//設定磁盤(sd卡)緩存政策,限制緩存時間;參數一:緩存檔案的路徑,參數二:緩存檔案的存活時間,系統目前時間-檔案的最新修改時間 > maxAge

// builder.discCache(new LimitedAgeDiskCache(cacheDir, maxAge) );

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

//設定記憶體緩存的大小限制,預設是最大記憶體的1/8
    builder.memoryCacheSize(maxMemory/8);

    //設定記憶體緩存政策                根據先進先出的原則上删除多餘對象  LinkedList  參數一:設定的緩存記憶體大小
           

// builder.memoryCache(new FIFOLimitedMemoryCache(sizeLimit));

//設定記憶體緩存政策          先删除占記憶體最大的圖檔      HashMap    參數一:設定的緩存記憶體大小
           

// builder.memoryCache(new LargestLimitedMemoryCache(sizeLimit));

//    設定記憶體緩存政策    Lru算法   LinkedHashMap  最大的緩存大小
           

// builder.memoryCache(new LruMemoryCache(maxSize))

//設定記憶體緩存政策        最少被用到的對象會被删除      HashMap    參數一:設定的緩存記憶體大小
           

// builder.memoryCache(new UsingFreqLimitedMemoryCache(sizeLimit))

//設定記憶體緩存政策        最早被添加的對象會被删除     HashMap  參數一:MemoryCache對象   參數二:緩存失效的最大時間
           

// builder.memoryCache(new LimitedAgeMemoryCache(cache, maxAge));

//初始化imageLoader配置
    imageLoader.init(builder.build());



/*  
    使用預設的緩存政策
    ImageLoader imageLoader2=ImageLoader.getInstance();
    ImageLoaderConfiguration.Builder configuration=new ImageLoaderConfiguration.Builder(this);
    imageLoader2.init(configuration.build());
    */
}
           

}

下面是擴充卡裡面的方法

package com.example.load___;

import com.nostra13.universalimageloader.core.ImageLoader;

import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;

public class Myadapter extends BaseAdapter {

    private MainActivity mainActivity;
    private String[] picPath1;

    public Myadapter(MainActivity mainActivity, String[] picPath1) {
        this.mainActivity = mainActivity;
        // TODO Auto-generated constructor stub
        this.picPath1 = picPath1;
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return picPath1.length;
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return ;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        convertView=View.inflate(mainActivity, R.layout.item, null);

        ImageView imageView = (ImageView) convertView.findViewById(R.id.imageView);
        ImageLoader imageLoader = ImageLoader.getInstance();
        imageLoader.displayImage(picPath1[position], imageView);
        return convertView;
    }

}

下面這個是跳轉到類型界面
           

package com.example.load___;

import java.util.ArrayList;

import java.util.List;

import android.app.Activity;

import android.content.Context;

import android.content.Intent;

import android.net.ConnectivityManager;

import android.net.NetworkInfo;

import android.os.Bundle;

import android.view.Menu;

import android.view.MenuItem;

import android.view.View;

import android.widget.AdapterView;

import android.widget.AdapterView.OnItemClickListener;

import android.widget.ArrayAdapter;

import android.widget.ListView;

import android.widget.Toast;

public class TypeActivity extends Activity {

String[] arr = new String[] {

"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12",

};
private ListView listView;

ArrayList<String> list = new ArrayList<String>();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_type);
    listView = (ListView) findViewById(R.id.listView);

    listView.setAdapter(new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, arr));
    listView.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {

            if (!list.contains(arr[position])) {
                list.add(arr[position]);
            }

        }
    });
}

public void load(View v) {
    if (isNetWorkAvailable(this)) {

        Intent intent = new Intent();
        intent.putStringArrayListExtra("type", list);
        setResult(99, intent);
        finish();
    } else {
        Toast.makeText(this, " 網絡不可用  ", 1).show();

    }
}

/**
 * 判斷網絡是否可用
 * 
 * @param context
 * @return
 */
public boolean isNetWorkAvailable(Context context) {
    ConnectivityManager manager = (ConnectivityManager) context
            .getSystemService(Context.CONNECTIVITY_SERVICE);
    if (manager != null) {
        NetworkInfo info = manager.getActiveNetworkInfo();
        if (info != null && info.isConnected()) {
            return true;
        } else {
            return false;
        }
    } else {
        return false;
    }
}
           

}

以上就是一個簡單的離線下載下傳緩存圖檔功能!希望可以給大家一點幫助!