Android异步加载学习笔记之一:用AsyncTask加载服务器json数据

 我们知道在Android开发中,UI主线程不能执行耗时太久的操作,Activity一般是不超过5s,BroadCaseReceiver一般不超过10s,因为这些耗时操作不仅仅阻塞UI线程操作,还可能导致用户不想见到的ANR,所以我们需要使用异步操作。

 我们通常用的异步操作有两种方式:

1:多线程或线程池异步加载,

2,AsyncTask异步任务操作(底层也是用的线程池)。

数据来源于慕课网:json数据地址:http://www.imooc.com/api/techer?type=4&num=30

首先定义加载数据的实体bean:

public class DataBean {

private String imgUrl;

private String title;

private String content;

public String getImgUrl() {

return imgUrl;

}

public void setImgUrl(String imgUrl) {

this.imgUrl = imgUrl;

}

public String getTitle() {

return title;

}

public void setTitle(String title) {

this.title = title;

}

public String getContent() {

return content;

}

public void setContent(String content) {

this.content = content;

}

@Override

public String toString() {

return "DataBean [imgUrl=" + imgUrl + ", title=" + title + ", content=" + content + ", getImgUrl()=" + getImgUrl() + ", getTitle()=" + getTitle() + ", getContent()=" + getContent() + "]";

}

}

然后在Activity中加载数据,布局中就一个ListView,布局代码就过了:

public class MainActivity extends ActionBarActivity {

private ListView mListView;

private String url = "http://www.imooc.com/api/techer?type=4&num=30";

private DataAdapter mAdapter;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

mListView = (ListView) findViewById(R.id.main_lv);

new MyAsyncTask().execute(url);

}

/**

* 解析返回的json数据为List<DataBean>

* @description:

* @author ldm

* @date 2015-8-10 下午8:44:19

*/

private List<DataBean> getGsonData(String url) {

List<DataBean> list = new ArrayList<DataBean>();

try {

String jsonStr = readStream(new URL(url).openStream());

JSONObject jobj = null;

DataBean bean = null;

jobj = new JSONObject(jsonStr);

JSONArray jsonArray = jobj.getJSONArray("data");

for (int i = 0; i < jsonArray.length(); i++) {

jobj = jsonArray.getJSONObject(i);

bean = new DataBean();

bean.setImgUrl(jobj.getString("picSmal"));

bean.setTitle(jobj.getString("name"));

bean.setContent(jobj.getString("description"));

list.add(bean);

}

}

catch (Exception e) {

e.printStackTrace();

}

return list;

}

private String readStream(InputStream is) {

InputStreamReader isr = null;

String result = "";

try {

isr = new InputStreamReader(is, "utf-8");

BufferedReader br = new BufferedReader(isr);

String line = "";

while ((line = br.readLine()) != null) {

result += line;

}

}

catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return result;

}

/**

* 异步任务:将url中的数据访问

* @description:

* @author ldm

* @date 2015-8-10 下午8:43:52

*/

class MyAsyncTask extends AsyncTask<String, Void, List<DataBean>> {

@Override

protected List<DataBean> doInBackground(String... params) {

// TODO Auto-generated method stub

return getGsonData(params[0]);

}

@Override

protected void onPostExecute(List<DataBean> result) {

// TODO Auto-generated method stub

super.onPostExecute(result);

mAdapter = new DataAdapter(MainActivity.this, result);//在数据加载成功后给ListView的适配器adapter设置数据

mListView.setAdapter(mAdapter);

}

}

}

接下来就是ListView的数据适配器:

public class DataAdapter extends BaseAdapter {

private Context mContext;

private List<DataBean> list;

public DataAdapter(Context mContext, List<DataBean> list) {

this.mContext = mContext;

this.list = list;

}

@Override

public int getCount() {

// TODO Auto-generated method stub

return list.size();

}

@Override

public Object getItem(int arg0) {

// TODO Auto-generated method stub

return list.get(arg0);

}

@Override

public long getItemId(int arg0) {

// TODO Auto-generated method stub

return arg0;

}

@Override

public View getView(int arg0, View view, ViewGroup arg2) {

ViewHolder holder=null;

if(view==null){

holder=new ViewHolder();

view=LayoutInflater.from(mContext).inflate(R.layout.item_layout, null);

holder.iv=(ImageView) view.findViewById(R.id.item_iv);

holder.titleTv=(TextView) view.findViewById(R.id.item_title);

holder.contentTv=(TextView) view.findViewById(R.id.item_content);

view.setTag(holder);

}else{

holder=(ViewHolder) view.getTag();

}

holder.titleTv.setText(list.get(arg0).getTitle());

holder.contentTv.setText(list.get(arg0).getContent());

holder.iv.setImageResource(R.drawable.ic_launcher);//先将图片展示固定图片,接下来就从网络获取

return view;

}

class ViewHolder {

TextView titleTv;

TextView contentTv;

ImageView iv;

}

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-02 08:23:40

Android异步加载学习笔记之一:用AsyncTask加载服务器json数据的相关文章

AngularJS学习笔记(3)——通过Ajax获取JSON数据

通过Ajax获取JSON数据 以我之前写的与用户交互的动态清单列表为例,使用JSON前todo.html代码如下: <!DOCTYPE html> <html ng-app="todoApp"> <head> <meta charset="UTF-8"> <title>TO DO List</title> <link href="./bootstrap/css/bootstrap

Android(java)学习笔记160:Framework运行环境之启动Zygote

前面Android(java)学习笔记159提到Dalvik虚拟机启动初始化过程,就下来就是启动zygote进程: zygote进程是所有APK应用进程的父进程:每当执行一个Android应用程序,Zygote就会孵化一个子线程去执行该应用程序(系统内部执行dvz指令完成的)  Å特别注意:系统提供了一个app_process进程,它会自动启动ZygoteInit.java和SystemServer.java这两个类,app_process进程本质上是使用dalvikvm启动ZygoteInit

加壳学习笔记(三)-简单的脱壳思路&amp;调试思路

首先一些windows的常用API: GetWindowTextA:以ASCII的形式的输入框 GetWindowTextW:以Unicaode宽字符的输入框 GetDlgItemTextA:以ASCII的形式的输入框 GetDlgItemTextW:以Unicaode宽字符的输入框 这些函数在使用的时候会有些参数提前入栈,如这函数要求的参数是字符串数目.还有大小写啦之类的东西,这些东西是要在调用该函数之前入栈,也就是依次push,就是说一般前面几个push接着一个call,那前面的push可能

Android(java)学习笔记71:生产者和消费者之等待唤醒机制

首先我们根据梳理我们之前Android(java)学习笔记70中关于生产者和消费者程序思路: 下面我们就要重点介绍这个等待唤醒机制: 第一步:还是先通过代码体现出等待唤醒机制 package cn.itcast_05; /* * 分析: * 资源类:Student * 设置学生数据:SetThread(生产者) * 获取学生数据:GetThread(消费者) * 测试类:StudentDemo * * 问题1:按照思路写代码,发现数据每次都是:null---0 * 原因:我们在每个线程中都创建了

加壳学习笔记(二)-汇编基础

7.简单的汇编语法:   堆栈平衡  PUSH,POP功能: 把操作数压入或取出堆栈语法: PUSH 操作数 POP 操作数格式: PUSH r PUSH M PUSH data POP r POP mPUSHF,POPF,PUSHA,POPA功能: 堆栈指令群格式: PUSHF POPF PUSHA POPAADD,ADC功能: 加法指令语法: ADD OP1,OP2 ADC OP1,OP2格式: ADD r1,r2 ADD r,m ADD m,r ADD r,data影响标志: C,P,A,

[转载]Android Bitmap和Canvas学习笔记

http://blog.chinaunix.net/uid-20771867-id-3053339.html [转载]Android Bitmap和Canvas学习笔记,布布扣,bubuko.com

Android(java)学习笔记167:Java中操作文件的类介绍

1.File类:对硬盘上的文件和目录进行操作的类.    File类是文件和目录路径名抽象表现形式  构造函数:        1) File(String pathname)       Creates a new File instance by converting the given pathname string into an abstract pathname. 2)File(File parent, String child)       Creates a new File i

Android(java)学习笔记205:网易新闻客户端应用编写逻辑过程

1.我们的项目需求是编写一个新闻RSS浏览器,RSS(Really Simple Syndication)是一种描述和同步网站内容的格式,是使用最广泛的XML应用.RSS目前广泛用于网上新闻频道,blog和wiki,主要的版本有0.91, 1.0, 2.0.使用RSS订阅能更快地获取信息,网站提供RSS输出,有利于让用户获取网站内容的最新更新.网络用户可以在客户端借助于支持RSS的聚合工具软件,在不打开网站内容页面的情况下阅读支持RSS输出的网站内容. 例如如下的网易RSS订阅: 2.由于我们这

Android(java)学习笔记204:自定义SmartImageView(继承自ImageView,扩展功能为自动获取网络路径图片)

1.有时候Android系统配置的UI控件,不能满足我们的需求,Android开发做到了一定程度,多少都会用到自定义控件,一方面是更加灵活,另一方面在大数据量的情况下自定义控件的效率比写布局文件更高. 2.下面我们是自定义一个SmartImageView继承自ImageView,扩展了ImageView的功能:     步骤: • 新建一个SmartImageView类,让继承自ImageView(放置特定的包下): • 实现SmartImageView类下的构造方法,最好全部实现,这个不容易出

加壳学习笔记(一)-基础知识

1.预备知识 1.关于栈,在windows里面的堆栈其实很简单,当学了才知道哈,呵呵,第一要记住的是windows里面的栈是向低地址生长的(extended,延伸,呵呵,顺便丰富下英语的单词量,确实是少的可怜),你可以这样认为,栈就像是一个倒立的箱子,箱子的口子是向下的,底是向上的,这里就表明了系统栈的分布也是延伸方向是由高地址向低地址extended,在最初的空栈阶段,栈顶(extended stack pointer,简称是esp)在栈底的低一个位置,呵呵,其实很好理解,就是说最初的箱子是空