編輯:關於android開發
解決OOM和圖片亂序問題

package com.android.test;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.assist.FailReason;
import com.nostra13.universalimageloader.core.listener.ImageLoadingListener;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.util.LruCache;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.TextView;
public class MainActivity extends Activity {
private ListView lv_images;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv_images = (ListView) findViewById(R.id.lv_images);
ImageLoaderConfiguration configuration=ImageLoaderConfiguration.createDefault(this);
ImageLoader.getInstance().init(configuration);
ListAdapter adapter = new ImageAdapter();
lv_images.setAdapter(adapter);
}
/**
* 適配器
* @author taoshihan
*
*/
class ImageAdapter extends BaseAdapter {
private ListView mListView;
private LruCache<String, BitmapDrawable> mImageCache;
public ImageAdapter() {
int maxSize=(int) (Runtime.getRuntime().maxMemory()/1024)/8;
mImageCache=new LruCache<String, BitmapDrawable>(maxSize){
protected int sizeOf(String key, BitmapDrawable drawable) {
return drawable.getBitmap().getByteCount()/1024;
};
};
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//第三個參數就是ListView
if(mListView==null){
mListView=(ListView) parent;
}
String url=(String) getItem(position);
View view;
if(convertView!=null){
view=convertView;
}else{
view=View.inflate(getApplicationContext(), R.layout.image_item, null);
}
ImageView imageView=(ImageView) view.findViewById(R.id.tv_image);
//給ImageView設置標簽
imageView.setTag(url);
BitmapDrawable bitmapDrawable=getBitmapFromMemoryCache(url);
if(bitmapDrawable!=null){
//讀取緩存圖片
imageView.setImageDrawable(bitmapDrawable);
}else{
//讀取網絡圖片
ImageWorkerTask task=new ImageWorkerTask(mListView,url);
task.execute(url);
}
return view;
}
/**
* 從緩存中讀取圖片
* @param key
* @return
*/
public BitmapDrawable getBitmapFromMemoryCache(String key) {
if(mImageCache.get(key)!=null){
return mImageCache.get(key);
}
return null;
}
public void addBitmapToMemoryCache(String key,BitmapDrawable drawable){
if(getBitmapFromMemoryCache(key)==null){
mImageCache.put(key, drawable);
}
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return Images.IMAGE_URLS.length;
}
@Override
public Object getItem(int position) {
return Images.IMAGE_URLS[position];
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
/**
* 異步任務
* @author taoshihan
*
*/
class ImageWorkerTask extends AsyncTask<String, Void, BitmapDrawable>{
private ImageView imageView;
public ImageWorkerTask(ListView parent,String imageUrl) {
//在ListView中通過標簽找到ImageView控件
this.imageView=(ImageView) parent.findViewWithTag(imageUrl);
}
@Override
protected BitmapDrawable doInBackground(String... params) {
String imageUrl=params[0];
Bitmap bitmap=downLoadBitmap(imageUrl);
BitmapDrawable drawable=new BitmapDrawable(getApplicationContext().getResources(),bitmap);
addBitmapToMemoryCache(imageUrl, drawable);
return drawable;
}
//下載圖片
private Bitmap downLoadBitmap(String imageUrl) {
Bitmap bitmap=null;
try {
URL url=new URL(imageUrl);
HttpURLConnection conn=(HttpURLConnection) url.openConnection();
conn.setConnectTimeout(10000);
InputStream is=conn.getInputStream();
bitmap=BitmapFactory.decodeStream(is);
} catch (Exception e) {
}
return bitmap;
}
//下載完成的
@Override
protected void onPostExecute(BitmapDrawable result) {
if(imageView!=null&&result!=null){
imageView.setImageDrawable(result);
}
}
}
}
static class Images{
public final static String[] IMAGE_URLS = new String[]{
"http://img.my.csdn.net/uploads/201508/05/1438760758_3497.jpg",
"http://img.my.csdn.net/uploads/201508/05/1438760758_6667.jpg",
"http://img.my.csdn.net/uploads/201508/05/1438760757_3588.jpg",
"http://img.my.csdn.net/uploads/201508/05/1438760756_3304.jpg",
"http://img.my.csdn.net/uploads/201508/05/1438760755_6715.jpeg",
"http://img.my.csdn.net/uploads/201508/05/1438760726_5120.jpg",
"http://img.my.csdn.net/uploads/201508/05/1438760726_8364.jpg",
"http://img.my.csdn.net/uploads/201508/05/1438760725_4031.jpg",
"http://img.my.csdn.net/uploads/201508/05/1438760724_9463.jpg",
"http://img.my.csdn.net/uploads/201508/05/1438760724_2371.jpg",
"http://img.my.csdn.net/uploads/201508/05/1438760707_4653.jpg"
};
}
}
android https正確調用方案(防中間人劫持),androidhttps
android https正確調用方案(防中間人劫持),androidhttps以下內容為原創,歡迎轉載,轉載請注明 來自博客園:http://www.cnblogs.c
Android學習指南之二十:Content Provider的使用
Content Provider屬於Android應用程序的組件之一,作為應用
Reveal-加載利用全局斷點
Reveal-加載利用全局斷點 在網上搜怎麼加載Reveal的,好多都是利用Reveal.frameWork來拖進工程裡面,這樣很不方便,每次更換新工程都要這樣做,這
第一篇 Windows環境下通過Eclipse創建的第一個安卓應用程序(圖文詳細步驟),
第一篇 Windows環境下通過Eclipse創建的第一個安卓應用程序(圖文詳細步驟),第一篇 windows環境下搭建創建的第一個安卓應用程序