編輯:關於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 mImageCache;
public ImageAdapter() {
int maxSize=(int) (Runtime.getRuntime().maxMemory()/1024)/8;
mImageCache=new LruCache(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{
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"
};
}
}
MVP模式在Android開發中的最佳實踐
這篇文章拖了好久了,一直存在草稿箱裡沒有繼續寫,趁今天有空,撸撸完。回想一下,你剛剛學習Android的時候,總會看到一些書上寫著,Android使用的是MVC模式,Ac
Android中通過Messenger與Service實現進程間雙向通信
Android中的Service和其調用者既可以在同一個App中,也可以在不同的App。如果Service在App1中,而調用Service的客戶端在App2中,那麼我們
Socket Android手機客戶端與PC服務端局域網內聯測試
Socket Android手機客戶端與PC服務端局域網內聯測試,筆者采用的是 PC服務器,Android平板客戶端 ,PC模擬器客戶端, 前段時間為了加深對Socket
Android基於反射技術實現的加減乘除運算示例
本文實例講述了Android基於反射技術實現的加減乘除運算。分享給大家供大家參考,具體如下:JAVA反射機制定義:JAVA反射機制是在運行狀態中,對於任意一個類,都能夠知