多线程和异步下载图片
2017-04-26 11:34
246 查看
一开始从慕课网学习到的异步加载显示图片,今天终于有时间按照记忆写了份异步加载图片代码;有很多小细节需要注意的。 步骤: 1、先解析完JSon数据,并存放在List中间 2、异步下载图片,放在Item.xml中 3、listView.setAdapter(teacherAapter);
1、从类开始介绍:
Teacher:图片bean
TeacherAdapter:适配器
ImageLoad:根据URL获取图片,显示到Item.xml中
MainActivity:从Json中获取数据,调用适配器,并显示;
2、解析Json
通过Thread来适配
public void getTeacher() { new Thread() { @Override public void run() { try { OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url("http://www.imooc.com/api/teacher?type=4&num=30") .build(); Response response = client.newCall(request).execute(); String data = response.body().string(); parseJson(data); //初始化适配器和列表 final TeacherAapter teacherAapter = new TeacherAapter(MainActivity.this,teacherList); runOnUiThread(new Runnable() { @Override public void run() { //在子线程中设置界面 listView.setAdapter(teacherAapter); } }); }catch (Exception e) { e.printStackTrace(); } } }.start(); } //解析Json public void parseJson(String data) { try { JSONObject jsonObject1 = new JSONObject(data); JSONArray jsonArray = jsonObject1.getJSONArray("data"); System.out.println("length:"+jsonArray.length()); for(int i=0;i<jsonArray.length();i++) { JSONObject jsonObject = jsonArray.getJSONObject(i); Teacher teacher = new Teacher(); teacher.setName(jsonObject.getString("name")); Log.d("name:",jsonObject.getString("name")); teacher.setPicSmall(jsonObject.getString("picSmall")); teacher.setDescription(jsonObject.getString("description")); teacherList.add(teacher); System.out.println("tea_list:"+teacherList.size()); } }catch (Exception e) { e.printStackTrace(); } }
AsyncTask 异步加载来适配
class MyAsyncTask extends AsyncTask<String,Void,List<Teacher>> { @Override protected List<Teacher> doInBackground(String... params) { teacherList = getTeacher(params[0]); return teacherList; } @Override protected void onPostExecute(List<Teacher> teacherList) { super.onPostExecute(teacherList); TeacherAapter teacherAapter = new TeacherAapter(MainActivity.this,teacherList); listView.setAdapter(teacherAapter); } }
//调用异步任务 new MyAsyncTask().execute(url);
3、加载图片
通过Thread加载
Handler handler = new Handler() { @Override public void handleMessage(Message msg) { // 通过判断加载的路径是否正确来加载图片, if (imageView.getTag().equals(url)) imageView.setImageBitmap((Bitmap) msg.obj); } }; public void showImageByThread(ImageView imageView, final String url) { this.url = url; this.imageView = imageView; new Thread(new Runnable() { @Override public void run() { try { Bitmap bitmap = getFromCache(url); if (bitmap == null) { URL url1 = new URL(url); HttpURLConnection connection = (HttpURLConnection) url1.openConnection(); InputStream is = connection.getInputStream(); bitmap = BitmapFactory.decodeStream(is); is.close(); //加入缓存 addToCache(url, bitmap); } // OkHttpClient client = new OkHttpClient(); // Request request = new Request.Builder() // .url(url) // .build(); // Response response = client.newCall(request).execute(); // byte[] b =response.body().string().getBytes(); // System.out.println("b.length"+b.length); // bitmap = BitmapFactory.decodeByteArray(b,0,b.length); Message message = handler.obtainMessage(); message.obj = bitmap; handler.sendMessage(message); } catch (Exception e) { e.printStackTrace(); } } }).start(); }
通过异步加载图片
//通过异步的方法加载 public void showImageByAsy(ImageView imageView, final String url) { this.url = url; this.imageView = imageView; new MyAsyLoad().execute(url); } class MyAsyLoad extends AsyncTask<String, Void, Bitmap> { @Override protected Bitmap 9f48 doInBackground(String... params) { Bitmap bitmap = getFromCache(params[0]); if (bitmap != null) return bitmap; try { URL url1 = new URL(params[0]); HttpURLConnection connection = (HttpURLConnection) url1.openConnection(); InputStream is = connection.getInputStream(); bitmap = BitmapFactory.decodeStream(is); is.close(); addToCache(params[0], bitmap); } catch (Exception e) { e.printStackTrace(); } return bitmap; } @Override protected void onPostExecute(Bitmap bitmap) { if (bitmap != null && imageView != null) imageView.setImageBitmap(bitmap); } }
4、Lrucache缓存
private LruCache<String, Bitmap> mCache; public ImageLoad() { int maxMemory = (int) Runtime.getRuntime().maxMemory(); int cacheSize = maxMemory / 8; // 设置图片缓存大小为程序最大可用内存的1/8 mCache = new LruCache<String, Bitmap>(cacheSize) { @Override protected int sizeOf(String key, Bitmap bitmap) { return bitmap.getByteCount(); } }; }
相关文章推荐
- iPhone开发【十七】多线程开发之NSOperation&NSOperationQueue——异步下载图片
- 多线程开发NSOperation&NSOperationQueue——异步下载图片
- Android:仿微博Listview与多线程功能(JSON、数据下载、图片加载、Listview、异步任务)
- iOS-UIImageView加载网络下载的图片(异步+多线程)
- iOS 开发 多线程详解之NSThread异步线程下载网络图片
- iPhone开发【十七】多线程开发之NSOperation&NSOperationQueue——异步下载图片
- 【iOS系列】-多图片多线程异步下载
- Android:仿微博Listview与多线程功能(JSON、数据下载、图片加载、Listview、异步任务)
- iPhone开发【十五】多线程开发之NSThread——异步下载图片
- iPhone开发【十七】多线程开发之NSOperation&NSOperationQueue——异步下载图片
- iPhone开发【十五】多线程开发之NSThread——异步下载图片
- 多线程开发之NSOperation&NSOperationQueue——异步下载图片
- 转载 Android多线程下载远程图片
- 异步网络编程之图片批量抓取下载(C#)
- 比较简洁的异步图片下载方法
- Android多线程下载远程图片
- Android异步下载网络图片&android解析xml文件的方式&使用Adapter为ListView提供数据
- Android异步下载网络图片(其一)
- android多线程下载图片
- Android异步下载网络图片(其一)