热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

异步任务下载图片,通过自定义适配器显示在列表

1.设计2.java代码下载网络资源工具类publicclassHttpUtils{获取网络上的json字符串输入String(url)返回Stri

1.设计

2.java代码

下载网络资源工具类

public class HttpUtils { // 获取网络上的json字符串 // 输入String(url) // 返回String(jsonStr)
    public static String getHttpStr(String url) { HttpClient httpClient = new DefaultHttpClient(); // Http客户端
        HttpGet httpGet = new HttpGet(url); // GET请求
        try { HttpResponse response = httpClient.execute(httpGet); // 发起请求
            if(response.getStatusLine().getStatusCode() == 200) { // 200表示连接成功
                HttpEntity entity = response.getEntity(); // Http实体(有效信息)
                InputStream is = entity.getContent(); // 通过实体获取网络资源的内容(InputStream) // 开始下载数据
                ByteArrayOutputStream baos = new ByteArrayOutputStream(); // 输出缓冲流(把全部的网络资源保存起来)
                byte[] buffer = new byte[1024]; // 缓冲区
                int ret; while(true) { ret = is.read(buffer); if(ret <0) { break; } baos.write(buffer, 0, buffer.length); // 每次把缓冲区的内容写入换冲流(缓冲区的内容每次都会不同)
 } return baos.toString(); // boas中的内容就是我们需要的数据了
 } } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; } // 获取网络上的图片 // 输入String(url) // 返回Bitmap(图片)
    public static Bitmap getHttpBitmap(String url) { HttpClient httpClient = new DefaultHttpClient(); // Http客户端
        HttpGet httpGet = new HttpGet(url); // GET请求
        try { HttpResponse response = httpClient.execute(httpGet); // 发起请求
            if(response.getStatusLine().getStatusCode() == 200) { // 200表示连接成功
                HttpEntity entity = response.getEntity(); // Http实体(有效信息)
                InputStream is = entity.getContent(); // 通过实体获取网络资源的内容(InputStream) // 开始下载数据
                ByteArrayOutputStream baos = new ByteArrayOutputStream(); // 输出缓冲流(把全部的网络资源保存起来)
                byte[] buffer = new byte[1024]; // 缓冲区
                int ret; while(true) { // 屌丝的代码 大神请忽略
                    ret = is.read(buffer); if(ret <0) { break; } baos.write(buffer, 0, buffer.length); // 每次把缓冲区的内容写入换冲流(缓冲区的内容每次都会不同)
 } byte[] byteArr = baos.toByteArray(); // boas中的内容就是我们需要的数据了 先转换成字节数组 // 把字节数组的内容转换成图片
                return BitmapFactory.decodeByteArray(byteArr, 0, byteArr.length); } } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; } }

解析JSON工具类

public class JSONUtils { // 格式为 // {"person":[{"address":"ServerForJSON/frjj.jpg","id":1001,"name":"Rose"}, // {"address":"ServerForJSON/frjj2.jpg","id":1002,"name":"Jack"}]} 
    public static List parsePersonJSONStr(String jsonStr) { try { List list = new ArrayList(); // 最外层的{}(JSONObject) 表示"所有人"
            JSONObject jsOnObject= new JSONObject(jsonStr); // 根据key="person"获取value(JSONArray)
            JSONArray jsOnArray= (JSONArray) jsonObject.get("person"); // 遍历jsonArray中每一个人 (JSONObject)
            for(int i = 0; i ) { // 获取每个人的json对象
                JSONObject jsonObject2 = (JSONObject) jsonArray.get(i); // 对于每一个人 分别获取address、id、name
                String address = (String) jsonObject2.get("address"); int id = (Integer) jsonObject2.get("id"); String name = (String) jsonObject2.get("name"); // 通过地址下载并生成图片
                Bitmap bitmap = HttpUtils.getHttpBitmap(MainActivity.URL+address); // 生成Person的对象
                Person person = new Person(id, name, address, bitmap); list.add(person); // 添加到list列表中
 } return list; // 返回人的列表
        } catch (JSONException e) { // TODO Auto-generated catch block
 e.printStackTrace(); } return null; } }

自定义适配器

public class MyAdapter extends BaseAdapter { private List list; private Context context; // 通过构造器传递参数 List、Context
    public MyAdapter(List list, Context context) { this.list = list; this.cOntext= context; } // 获取数据的大小数量(List)
 @Override public int getCount() { return list.size(); } // 根据下标获取列表中具体的数据
 @Override public Object getItem(int position) { return list.get(position); } // 根据下标获取ID(下标)
 @Override public long getItemId(int position) { return position; } // 根据下标获取对应的视图
 @Override public View getView(int position, View convertView, ViewGroup parent) { View view = null; ViewHolder holder = null; if(cOnvertView== null) { // 1. 首次加载时 没有缓冲的view 只能创建View
            LayoutInflater inflater = LayoutInflater.from(context); view = inflater.inflate(R.layout.item, null); // 2. 创建holder 并在view中查找holder中的视图(查找是很耗时间的)
            holder = new ViewHolder(); holder.image = (ImageView) view.findViewById(R.id.image); // 图片
            holder.textview1 = (TextView) view.findViewById(R.id.textview1); // id
            holder.textview2 = (TextView) view.findViewById(R.id.textview2); // 姓名 // 3. 绑定view和holder
 view.setTag(holder); } else { // 1. 后面加载时 已经有缓存的view 可复用
            view = convertView; // 2. 直接拿来使用
            holder = (ViewHolder) view.getTag(); } // 4. 给image、textview1、textview2赋值
        Person person = list.get(position); // 具体的人
        Bitmap bitmap = person.getBitmap(); // 得到TA的图片
 holder.image.setImageBitmap(bitmap); int id = person.getId(); // 得到TA的id
        holder.textview1.setText(id+""); String name = person.getName(); // 得到TA的name
 holder.textview2.setText(name); // 5. 返回view
        return view; } // ViewHolder内部类 把视图包装在一起
    public class ViewHolder { public ImageView image;// 图片
        public TextView textview1; // id
        public TextView textview2; // 姓名
 } }

异步任务类

public class MyTask extends AsyncTask> { private Context context; // 上下文
    private ListView listview; // 列表视图 // 通过构造器传递参数 context、listview
    public MyTask(Context context, ListView listview) { this.cOntext= context; this.listview = listview; } // 执行下载、解析json字符串的功能(子线程)
 @Override protected List doInBackground(String... params) { String url = params[0]; // 获得输入的url // 通过url下载json字符串
        String jsOnStr= HttpUtils.getHttpStr(url); // 通过json字符串获取人的列表
        List list = JSONUtils.parsePersonJSONStr(jsonStr); // 调试中……测试成功
        Log.i("MyTask", jsonStr); for(Person p : list) { Log.i("MyTask", p.toString()); } return list; } // 执行后台操作前的准备步骤(主)(显示对话框)
 @Override protected void onPreExecute() { // TODO Auto-generated method stub
        super.onPreExecute(); } // 执行后台操作后的处理工作(主)(取消对话框、显示结果)
 @Override protected void onPostExecute(List result) { // 到这里才开始启动adapter // 因为到这里 才能真正得到数据
        MyAdapter adapter = new MyAdapter(result, context); listview.setAdapter(adapter); // 把数据设置到listview上
        super.onPostExecute(result); } }

对象类

public class Person { private int id; private String name; // 姓名
    private String address; // 图片地址
    private Bitmap bitmap; // 图片 // 构造器
    public Person() {} public Person(int id, String name, String address, Bitmap bitmap) { super(); this.id = id; this.name = name; this.address = address; this.bitmap = bitmap; } // getter setter
    public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public Bitmap getBitmap() { return bitmap; } public void setBitmap(Bitmap bitmap) { this.bitmap = bitmap; } // toString
 @Override public String toString() { return "Person [id=" + id + ", name=" + name + ", address=" + address + ", bitmap=" + bitmap + "]"; } }

MainActivity类

public class MainActivity extends Activity { // 地址常量 // 下载json字符串时使用:http://10.16.154.26:8080/ServerForJSON/JsonServlet // URL+PATH // 下载图片时使用:http://10.16.154.26:8080/ServerForJSON/frjj.jpg // URL+address
    public static final String URL = "http://10.16.154.26:8080/"; public static final String PATH = "ServerForJSON/JsonServlet"; private ListView listview; private ImageView imageview; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 找出activity_main中的listview
        listview = (ListView) findViewById(R.id.listview); // 设置当listview中没有数据的时候 显示空白的图片
        imageview = (ImageView) findViewById(R.id.imageview); listview.setEmptyView(imageview); // 创建异步任务类并启动执行子线程
        MyTask task = new MyTask(MainActivity.this, listview); task.execute(URL+PATH); } }

3.UML流程图

4.效果图

 


推荐阅读
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 图像因存在错误而无法显示 ... [详细]
  • 本文介绍了一款名为TimeSelector的Android日期时间选择器,采用了Material Design风格,可以在Android Studio中通过gradle添加依赖来使用,也可以在Eclipse中下载源码使用。文章详细介绍了TimeSelector的构造方法和参数说明,以及如何使用回调函数来处理选取时间后的操作。同时还提供了示例代码和可选的起始时间和结束时间设置。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 本文介绍了如何使用elementui分页组件进行分页功能的改写,只需一行代码即可调用。通过封装分页组件,避免在每个页面都写跳转请求的重复代码。详细的代码示例和使用方法在正文中给出。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
author-avatar
CleanTheString
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有