- 浏览: 117795 次
- 性别:
- 来自: 东莞
-
文章分类
最新评论
-
ihopethatwell:
楼主附上布局吧
【Android】获得已安装应用 -
dyingbleed:
kangsoft 写道IntentService 里貌似不用再 ...
【Android】IntentService多线程 -
kangsoft:
IntentService 里貌似不用再创建线程啊。。
【Android】IntentService多线程 -
hualang:
不错,不过有个问题:设置后各个Item无法点击,还要设置cli ...
【Android】GridView添加网格线 -
dyingbleed:
sword_java 写道实现的 太片面了, 只有 delet ...
【Android】继承SimpleCursorAdapter定制Adapter
LoadRemoteImage
公有成员方法setRemoteImageListener用于监听远端图片
传入两个参数:String url 图片URL地址 OnRemoteImageListener listener OnRemoteImageListener接口
线程Runnable接口处理流程图:
package lizhen.dg; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.util.EntityUtils; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Handler; import android.os.Message; /** * 遠端圖片類 * */ public class LoadRemoteImage { private ExecutorService pool; //線程池 private final int MESSAGE_OK = 1; //遠端圖片獲取成功消息 private final int MESSAGE_ERROR = -1; //遠端圖片獲取錯誤消息 private ImageBuffer imageBuffer; //圖片緩存 /** * 構造函數 * 執行初始化操作 * */ public LoadRemoteImage() { pool = Executors.newCachedThreadPool(); imageBuffer = new ImageBuffer(); } /** * 設置遠端圖片事件監聽器 * @param url 圖像URL地址 * @param listener 遠端圖片監聽器 * */ public void setRemoteImageListener(final String url, final OnRemoteImageListener listener) { /* * 遠端圖片消息處理Handler * */ final Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); int what = msg.what; switch(what) { case MESSAGE_OK : //成功 listener.onRemoteImage((Bitmap) msg.obj); //調用onRemoteImage回調方法 break; case MESSAGE_ERROR : //錯誤 listener.onError((String) msg.obj); ////調用onError回調方法 break; } } }; /* * 向線程池中添加新任務 * 下載給定URL地址圖片 * */ pool.execute(new Runnable() { @Override public void run() { try { Bitmap image = null; /* * 如果圖片緩存中沒有該圖片,則下載放入緩存中 * */ if((image = imageBuffer.get(url)) == null) { byte[] resource = httpRequestByteArray(url); //HTTP請求圖片字節數據 image = optimizeBitmap(resource, 100, 100); //獲得優化的圖像 imageBuffer.put(url, image); } handler.sendMessage(handler.obtainMessage(MESSAGE_OK, image)); //遠端圖像下載成功 } catch (Exception e) { /* * 異常處理 * */ handler.sendMessage(handler.obtainMessage(MESSAGE_ERROR, e.getMessage())); return; } } }); } /** * 使用HTTP GET方式請求 * @param url URL地址 * @return HttpEntiry對象 * @throws Exception * */ private byte[] httpRequestByteArray(String url) throws Exception { byte[] result = null; HttpGet httpGet = new HttpGet(url); HttpClient httpClient = new DefaultHttpClient(); HttpResponse httpResponse; httpResponse = httpClient.execute(httpGet); int httpStatusCode = httpResponse.getStatusLine().getStatusCode(); /* * 判斷HTTP狀態碼是否為200 * */ if(httpStatusCode == HttpStatus.SC_OK) { result = EntityUtils.toByteArray(httpResponse.getEntity()); } else { throw new Exception("HTTP: "+httpStatusCode); } return result; } private Bitmap optimizeBitmap(byte[] resource, int maxWidth, int maxHeight) { Bitmap result = null; int length = resource.length; BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; result = BitmapFactory.decodeByteArray(resource, 0, length, options); int widthRatio = (int) Math.ceil(options.outWidth / maxWidth); int heightRatio = (int) Math.ceil(options.outHeight / maxHeight); if(widthRatio > 1 || heightRatio > 1) { if(widthRatio > heightRatio) { options.inSampleSize = widthRatio; } else { options.inSampleSize = heightRatio; } } options.inJustDecodeBounds = false; result = BitmapFactory.decodeByteArray(resource, 0, length, options); return result; } /** * 遠端圖片監聽器 * */ public interface OnRemoteImageListener { /** * 遠端圖片處理 * @param image 位圖圖片 * */ void onRemoteImage(Bitmap image); /** * 錯誤處理 * @param error 錯誤信息 * */ void onError(String error); } }
ImageBuffer 图片缓存
String键->SoftReference<Bitmap>值储存缓存图片
SoftReference软引用
在内存吃紧抛出“OutOfMemory”异常之前,会被JVM回收,此时调用get方法会返回null
package lizhen.dg; import java.lang.ref.SoftReference; import java.util.HashMap; import java.util.Map; import android.graphics.Bitmap; /** * 圖片緩存類 * */ public class ImageBuffer { private Map<String, SoftReference<Bitmap>> buffer = new HashMap<String, SoftReference<Bitmap>>(); //圖片緩存 /** * 將圖片放進緩存中 * @param key 鍵值 * @param image Bitmap位圖 * */ public void put(String key, Bitmap image) { SoftReference<Bitmap> reference = new SoftReference<Bitmap>(image); synchronized(buffer) { buffer.put(key, reference); } } /** * 從緩存中取得圖片 * @param key 鍵值 * @return Bitmap位圖 * */ public Bitmap get(String key) { Bitmap result = null; synchronized(buffer) { if(buffer.containsKey(key)) { result = buffer.get(key).get(); } } return result; } }
ListActivity
ListView列表异步加载远端图片
package lizhen.dg; import android.app.ListActivity; import android.content.Context; import android.graphics.Bitmap; import android.os.Bundle; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.Toast; public class Main extends ListActivity { private String data[] = { "http://192.168.211.86/pic/0.jpg" , "http://192.168.211.86/pic/1.jpg" , "http://192.168.211.86/pic/2.jpg" , "http://192.168.211.86/pic/3.jpg" , "http://192.168.211.86/pic/4.jpg" , "http://192.168.211.86/pic/5.jpg" , "http://192.168.211.86/pic/6.jpg" , "http://192.168.211.86/pic/7.jpg" , "http://192.168.211.86/pic/8.jpg" , "http://192.168.211.86/pic/9.jpg" , "http://192.168.211.86/pic/10.jpg" , "http://192.168.211.86/pic/11.jpg" , "http://192.168.211.86/pic/12.jpg" //錯誤的圖片地址 }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); setListAdapter(new MyListAdapter(this, data)); } private class MyListAdapter extends BaseAdapter { private Context context; private String[] data; private LoadRemoteImage remoteImage; public MyListAdapter(Context context, String[] data) { this.context = context; this.data = data; remoteImage = new LoadRemoteImage(); } @Override public int getCount() { return data.length; } @Override public Object getItem(int position) { return data[position]; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { Holder holder = null; if(convertView == null) { convertView = getLayoutInflater().inflate(R.layout.item, parent, false); holder = new Holder(convertView); convertView.setTag(holder); } else { holder = (Holder) convertView.getTag(); } final ImageView icon = holder.getIcon(); icon.setImageResource(R.drawable.icon); remoteImage.setRemoteImageListener((String) getItem(position), new LoadRemoteImage.OnRemoteImageListener() { @Override public void onError(String error) { Toast.makeText(context, error, Toast.LENGTH_LONG).show(); } @Override public void onRemoteImage(Bitmap image) { icon.setImageBitmap(image); } }); holder.getName().setText((String) getItem(position)); return convertView; } } }
package lizhen.dg; import android.view.View; import android.widget.ImageView; import android.widget.TextView; public class Holder { private View parentView; private ImageView iconImageView; private TextView labelTextView; public Holder(View view) { this.parentView = view; } public ImageView getIcon() { if(iconImageView == null) { iconImageView = (ImageView) parentView.findViewById(R.id.item_IconImageView); } return iconImageView; } public TextView getName() { if(labelTextView == null) { labelTextView = (TextView) parentView.findViewById(R.id.item_NameTextView); } return labelTextView; } }
运行结果:
发表评论
-
【Android】继承SimpleCursorAdapter定制Adapter
2011-11-07 14:42 8487SimpleCursorAdapter是一个简单的adapte ... -
【Android】GridView添加网格线
2011-11-03 16:54 44772GridView网格布局,默认情况下是没有网格线的 查找网上 ... -
【Android】动态更新ListView
2011-10-31 19:06 7703实现效果:当滑动ListView列表最底端时,动态的添加新的列 ... -
【Android】发送Email(内置Gmail和JavaMail)
2011-10-28 11:00 10855Android发送Email的两种方法: 方法一:通过 ... -
【Android】消除GridView周围空隙
2011-10-26 10:54 3303使用GridView布局,视图周围会出现非常影响美观的空隙。 ... -
【Android】创建自定义复合控件
2011-10-04 16:21 4387复合控件是将一组相互关联的已有控件整合,从而可以当作单个 ... -
Android使用Matrix处理图像(一)
2011-09-23 16:05 0Matrix是一个3X3的矩阵,如下图所示: Mat ... -
【Android】AsyncTask实现异步处理
2011-09-22 15:54 5196AsyncTask提供了简单易用的方式,执行后台操作并更新UI ... -
【Android】高效ListView
2011-09-21 09:15 1555在实际开发过程中,为了定制ListView项内容,通常所使用的 ... -
【Android】图片显示内存优化(解决“bitmap size exceeds VM budget”异常)
2011-09-19 12:03 4338public Bitmap optimizeBitma ... -
【Android】网络状态
2011-09-19 11:24 1745package lizhen.network; ... -
【Android】HTTP请求远端String和byte[]数据
2011-09-19 10:51 3342package lizhen.http; impo ...
相关推荐
对于图片加载,我们可以使用像Picasso、Glide或者Fresco这样的库,它们可以处理异步加载、缓存和图片变形等问题。 在`getView()`方法中,当接收到图片URL时,调用图片加载库的方法,传入ImageView和URL。这样,图片...
常见的网络库如Android的Volley、OkHttp和iOS的AFNetworking等提供了异步加载、缓存策略等功能。 2. **缓存机制**:为提高性能和用户体验,图片加载时通常会使用缓存策略。本地缓存可以存储已下载过的图片,下次再...
Android提供了Bitmap类,可以用于图片的加载、缩放和压缩。另外,第三方库如Glide或Picasso可以更高效地管理图像资源。 7. **多线程**:由于网络操作和UI更新不能在主线程中执行,应用会使用AsyncTask或者Handler-...
- **懒加载**:只在视图即将进入屏幕可见区域时才加载数据或图片资源,这样可以显著减少初始加载时间。 - **分页加载**:随着用户的滚动,动态加载更多的数据项。这可以减少初次加载时的数据量,提高用户体验。 - ...
这些知识有助于开发者构建后端服务,与Android客户端进行交互,实现数据的动态加载和展示。 服务器端开发中,JDBC(Java Database Connectivity)用于连接数据库,如MySQL,是处理应用数据存储的关键。熟悉SQL语句...
这个过程涉及到两部分的开发工作:WEB开发(服务器端)和Android开发(客户端)。 **1. WEB开发(服务器端)** 在WEB开发中,服务器端通常使用PHP、Java、Python等后端语言来处理请求,生成XML数据。XML...
同时,对UI进行优化,如使用异步加载,避免阻塞主线程。 10. **测试与发布**:在应用开发完成后,进行单元测试、集成测试和UI测试,确保所有功能正常运行。然后,打包应用并发布到Google Play Store或其他第三方...
Xamarin应用的性能优化至关重要,这可能包括代码分割、延迟加载、异步编程和资源优化等策略。对于图书数据的加载,可能采用分页加载技术,减少初次加载时的数据量,提高启动速度。 7. **测试与调试** 使用Xamarin...