Android--多线程之图文混排
前言
本周一直在说Android多线程的那些事儿,本篇博客聊一聊Android开发中一个比较经典的案例,网络数据图文混排,本片博客的案例只涉及关于开启多线程访问网络数据,不涉及缓存的内容。众所周知,从网络上获取一段文本肯定要比获取一张张的图片要省时,所以一般如果是获取图片+文本的数据,会先开启一条线程获取文本数据,再从开启另外的线程来单独获取图片信息。本案例填充一个自定义的XML布局文件作为数据项,并使用ListView承载数据。
数据准备
本案例中的服务端数据以Json的形式传递,在服务端使用.Net开发一个一般处理程序,序列化一个产品对象,里面包含名称、价格、图片名称,最后序列化成JSON格式的数据返回给客户端。关于.Net下如何序列化一个对象成JSON格式,可以参见博客:C#--对象转Json序列化,这里不再累述,大家可以使用自己熟悉的服务端技术模拟JSON数据。
获取JSON数据的一般处理程序地址:http://192.168.1.102:1231/json/returnCommondityJson.ashx,数据如下
[{"imageName":"image1.png","name":"苹果","price":12},
{"imageName":"image2.png","name":"闹钟","price":56},
{"imageName":"image3.png","name":"蛋糕","price":24},
{"imageName":"image4.png","name":"零钱包","price":8},
{"imageName":"image5.png","name":"书本","price":42},
{"imageName":"image6.png","name":"糖果","price":16},
{"imageName":"image7.png","name":"西瓜","price":2}]
本案例的URL地址均使用一个CommonUri类进行管理:
package com.example.handlerimageortext;
public class CommonUri {
// 访问服务器数据的链接
public static final String PRODUCT_URL = "http://192.168.1.102:1231/json/returnCommondityJson.ashx";
// 图片的连接
public static final String PRODUCT_IMG="http://192.168.1.102:1231/json/img/";
}
使用AsyncTask获取Json数据
在UI线程中,使用AsyncTask的方式访问网络获取JSON数据,并对其进行解析,关于Android下JSON解析的内容可以参见博客:JSON解析。
public class MyTask extends AsyncTask<String, Void, List<Map<String,Object>>>{
@Override
protected void onPreExecute() {
super.onPreExecute();
// 显示对话框
dialog.show();
}
@Override
protected List<Map<String, Object>> doInBackground(String... params) {
List<Map<String,Object>> list=new ArrayList<Map<String,Object>>();
try {
// 获取网络JSON格式数据
HttpClient httpClient=new DefaultHttpClient();
HttpPost httpPost=new HttpPost(params[0]);
HttpResponse httpResponse=httpClient.execute(httpPost);
if(httpResponse.getStatusLine().getStatusCode()==200){
String jsonString=EntityUtils.toString(httpResponse.getEntity(),"utf-8");
// 解析Json格式数据,并使用一个List<Map>存放
JSONArray jsonArray=new JSONArray(jsonString);
for(int i=0;i<jsonArray.length();i++){
JSONObject jsonObject=jsonArray.getJSONObject(i);
Map<String,Object> map=new HashMap<String, Object>();
map.put("name",jsonObject.get("name"));
map.put("price",jsonObject.get("price"));
map.put("imageName",jsonObject.get("imageName"));
list.add(map);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
@Override
protected void onPostExecute(List<Map<String, Object>> result) {
super.onPostExecute(result);
// 把查询到的数据传递给适配器
adapter.setData(result);
// 为ListView设定适配器
listview.setAdapter(adapter);
adapter.notifyDataSetChanged();
// 隐藏对话框
dialog.dismiss();
}
}
下载图片信息
上面的方法中,使用AsyncTask访问网络获取到产品的信息,其中有图片的名称,可以通过这个地址下载图片到本地。
新创建一个类,用于下载图片,但是需要在主线程中访问图片的信息,可以使用接口回调的方式在Handler中处理子线程发送过来的消息。注释比较全,这里就不再累述了。
package com.example.handlerimageortext; import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.os.Message; public class DownLoadImage {
private String image_path; public DownLoadImage(String image_path) {
// 保存图片的下载地址
this.image_path = image_path;
} public void loadImage(final ImageCallback callback) {
final Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
// 接受到消息后,调用接口回调的方法
callback.getDrawable((Drawable) msg.obj);
}
};
// 开启一个新线程用于访问图片数据
new Thread(new Runnable() { @Override
public void run() {
try {
// 下载图片为Drawable对象
Drawable drawable = Drawable.createFromStream(new URL(
image_path).openStream(), "");
// 把图片对象包装成一个消息发送给Handler
Message message = Message.obtain();
message.what = 1;
message.obj = drawable;
handler.sendMessage(message);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
} // 定义一个公开的接口,用于执行回调操作
public interface ImageCallback {
public void getDrawable(Drawable draw);
}
}
数据的适配器
上面已经获取到Json数据中产品的数据,和产品的图片,现在声明一个Adapter类,继承自BaseAdapter,使用一个布局XML资源文件,用于填充数据。
public class MyAdapter extends BaseAdapter{
private Context context;
private LayoutInflater layoutInflater;
private List<Map<String,Object>> list=null;
public MyAdapter(Context context){
this.context=context;
layoutInflater=LayoutInflater.from(context);
}
public void setData(List<Map<String,Object>> list){
this.list=list;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view=null;
if(convertView==null){
// 如果View为空,则以布局XML资源文件填充View
view=layoutInflater.inflate(R.layout.item,null);
}else{
view=convertView;
}
TextView name=(TextView)view.findViewById(R.id.textView1);
TextView price=(TextView)view.findViewById(R.id.textView2);
// 因为需要在回调接口中访问这个ImageView控件,所以需要声明为final
final ImageView imageview=(ImageView)view.findViewById(R.id.imageView1);
name.setText(list.get(position).get("name").toString());
price.setText(list.get(position).get("price").toString());
// 使用DownLoadImage,下载地址代表的图片
DownLoadImage downLoadImage=new DownLoadImage(CommonUri.PRODUCT_IMG+list.get(position).get("imageName").toString());
// 使用回调接口,设置ImageView的图片
downLoadImage.loadImage(new ImageCallback() {
@Override
public void getDrawable(Drawable draw) {
imageview.setImageDrawable(draw);
}
});
return view;
}
}
效果展示:

Android--多线程之图文混排的更多相关文章
- 使用android SpannableStringBuilder实现图文混排
项目开发中需要实现这种效果 多余两行,两行最后是省略号,省略号后面是下拉更多 之前用过的是Html.fromHtml去处理图文混排的,仅仅是文字后图片或者文字颜色字体什么的, 但是这里需要在最后文字的 ...
- 使用android SpannableStringBuilder实现图文混排,看到许多其他
项目开发需要达到这种效果 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZmFuY3lsb3ZlamF2YQ==/font/5a6L5L2T/fontsiz ...
- Android TextView中图文混排设置行间距导致高度不一致问题解决
最近项目中需要实现一个评论带表情的功能,刚开始一切顺利,非常easy,突然有一天发现文字跟表情混排的时候,TextView中图文高度不一致,excuse...什么鬼,之前明明测试过图文混排,不存在这个 ...
- android开发 自定义图文混排控件
功能:图文混排,可自动缩放字体,如图: 单点触控使用的代码来自:http://blog.csdn.net/xiaanming/article/details/42833893 谢谢博主! 在该dem ...
- 【转】Android TextView SpannableStringBuilder 图文混排颜色斜体粗体下划线删除线
spannableStringBuilder 用法详解: SpannableString ss = new SpannableString("红色打电话斜体删除线绿色下划线图片:." ...
- Android 自绘TextView解决提前换行问题,支持图文混排
先看下效果图: 上面是MTextView,下面是默认的TextView. 一.原因 用最简单的全英文句子为例,如果有一个很长的单词,这一行剩余的空间显示不下了,那么规则就是不打断单词,而是把整个单词丢 ...
- Android自动解析html带图片,实现图文混排
在android中,如何将html代码转换为text,然后显示在textview中呢,有一个简单直接的方法: textView.setText(Html.fromHtml(content)); 然而用 ...
- Android中Textview显示Html,图文混排,支持图片点击放大
本文首发于网易云社区 对于呈现Html文本来说,Android提供的Webview控件可以得到很好的效果,但使用Webview控件的弊端是效率相对比较低,对于呈现简单的html文本的话,杀鸡不必使用牛 ...
- Android 图文混排 通过webview实现并实现点击图片
在一个开源项目看到是用的webview 实现的 1. 这是在asset中的一个模板html <html> <head> <title>News Detail< ...
- android:怎样在TextView实现图文混排
我们通常在TextView文本中设置文字.但是怎样设置图文混排呢? 我就在这里写一个样例 .我们须要用到一点简单的HTML知识 在TextView中预订了一些类似HTML的标签,通过标签能够使Text ...
随机推荐
- SRILM的使用及平滑方法说明
1.简介 SRILM是通过统计方法构建语言模型,主要应用于语音识别,文本标注和切分,以及机器翻译等. SRILM支持语言模型的训练和评测,通过训练数据得到语言模型,其中包括最大似然估计及相应的平滑算法 ...
- Python——教你画朵太阳花
用python中的turtle函数画个太阳花,有以下几个步骤 1.首先,我们在开始中找到Python语言的IDLE软件脚本 2.然后出现该软件界面,如图,点击上面的Eile 3.然后在 ...
- 复习支持向量机(SVM)没空看书时,掌握下面的知识就够了
支持向量机(support vector machines, SVM)是一种二类分类模型.它的基本模型是定义在特征空间上的间隔最大的线性分类器:支持向量机还包括核技巧,这使它成为实质上的非线性分类器. ...
- 2019.03.29 NOIP训练 友好国度(点分治+容斥)
传送门 思路: 直接上点分治+容斥计算每个因数对应的贡献即可. 代码: #include<bits/stdc++.h> #define ri register int using name ...
- 数据结构与STL容器
1.静态数组 静态数组就是大小固定不能扩展的数组,如C中普通数组.C++11中array. 2.动态数组 动态数组的空间大小在需要的时候可以进行再分配,其代表为vector.由于数组的特点,在位置0插 ...
- 安装vue-cli脚手架构建工具
vue安装 1.vue安装: $ cnpm install vue 2.安装vue-cli脚手架构建工具: # 全局安装 vue-cli $ cnpm install --global vue-cli ...
- 功能强大的js数组方法:reduce
arr.reduce()方法接受一个函数作为累加器,数组中的每个值从左到右开始缩减,最终为一个值. reduce接受的参数主要有callback(回调函数)和可选参数initvalue(作为第一次调用 ...
- Exp3 免杀原理与实践 ——20164325王晓蕊
一.实践基本内容 1.实践目标 (1) 正确使用msf编码器(√),msfvenom生成如jar之类的其他文件(√),veil-evasion(√),加壳工具(√),使用shellcode编程(√) ...
- SVN设置全局忽略提交文件或者目录
在目录中右击选择TortoiseSVN -> 设置 -> 常规设置 -> 全局忽略样式 修改全局忽略样式(可以设置忽略的文件或者目录,以空格隔开):*.o *.lo *.la *.a ...
- QQ的发展演变
在其发展史上,以色列人功不可没.正是四位以色列籍的年轻人,在1996年7月成立的Mirabilis公司,并于同年11月推出了全世界第一个即时通讯软件ICQ,取意为“我在找你”——“I Seek You ...