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);
			}
		});
	}
}

猜你喜欢

转载自gaoyunna201609092628.iteye.com/blog/2324910