Android中异步解析AsyncTask工具类封装

为了更加方便我们在子线程中对 UI 进行操作, Android 还提供了另外一些好用的工
具,AsyncTask 就是其中之一。借助 AsyncTask,即使你对异步消息处理机制完全不了解,
也可以十分简单地从子线程切换到主线程。当然,AsyncTask 背后的实现原理也是基于异步
消息处理机制的,只是 Android 帮我们做了很好的封装;
AsyncTask 类是一个抽象类,指定三个泛型参数,这三个参数的用途:
1. Params
在执行 AsyncTask 时需要传入的参数,可用于在后台任务中使用。
2. Progress
后台任务执行时,如果需要在界面上显示当前的进度,则使用这里指定的泛型作为进度单位。
3.Result
当任务执行完毕后,如果需要对结果进行返回,则使用这里指定的泛型作为返回值类型。
因此,一个最简单的自定义 AsyncTask 就可以写成如下方式:
class DownloadTask extends AsyncTask<Void, Integer, Boolean> {
……
}
学习了HttpURLConnection后,每次发起请求都需要使用异步加载,因为网络请求必须放在子线程中执行,一个应用程序很可能会在许多地方都使用到网络功能,而代码只有网络请求的路径不同,因此;我们可以把异步加载和发起网络请求提取到一个公共的类库中,这个类不处理图片,只是把一个网址最终返回一个json串的处理类;
1;把流转为字符串的工具类

package com.example.asynnet.util;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

public class ReadStreamUtils {
public static String toJson(InputStream is) {
byte[] b = new byte[1024];
int len = 0;
ByteArrayOutputStream os = new ByteArrayOutputStream();
try {
while ((len = is.read(b)) != -1) {
os.write(b, 0, len);
os.flush();
}
return os.toString("utf-8");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (os != null)
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}

return null;
}

}


2; AsynTask工具类提取

package com.example.asynnet.util;

import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import android.os.AsyncTask;

public class UrlFileAsynNetUtils extends AsyncTask<String, Void, String> {

@Override
protected String doInBackground(String... params) {
try {
URL url = new URL(params[0]);
HttpURLConnection connection = (HttpURLConnection) url
.openConnection();
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setConnectTimeout(8000);
connection.setReadTimeout(8000);
if (connection.getResponseCode() == 200) {
return ReadStreamUtils.toJson(connection.getInputStream());
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}

}


3. Activity中传入url就可获得json串了

private ListView lv;
private List<String> types;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = (ListView) findViewById(R.id.lv_booksort);
String url = "http://japi.juhe.cn/comic/category?key=26e141e02d5c802d39ccf3ae918a7146";
UrlFileAsynNetUtils netu = new UrlFileAsynNetUtils() {

@Override
protected void onPostExecute(String result) {
Gson gson = new Gson();
BookSortJson list = gson.fromJson(result, BookSortJson.class);
types = list.result;
//
lv.setAdapter(new ArrayAdapter<String>(MainActivity.this,
android.R.layout.simple_list_item_1,types ));
}
};
// 开始调用
netu.execute(url);

//点击进行查询对应类型的图书列表
lv.setOnItemClickListener(new OnItemClickListener() {

@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Intent intent=new Intent(MainActivity.this, BookItemActivity.class);
intent.putExtra("type", types.get(position));
startActivity(intent);
}
});
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值