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