AsyncTask本身是一个抽象类,如果要实现自己的AsyncTask,需要继承AsyncTask并定义自己的实现类。注意AsyncTask有三个泛型参数:
public abstract class AsyncTask<Params, Progress, Result>
**这三个参数应该是引用类型,包括类、接口、数组。但不能是基本数据类型(可以考虑使用包装类来代替)。
这三个泛型参数描述如下:**
⦁ Params:传入异步任务中参数的类型
⦁ Progress:异步任务运行过程中,返回的中间值的类型。
⦁ Result:异步任务返回值的类型
如果定义了自己的异步任务,一般需要实现3个方法。
⦁ onPreExecute():异步任务执行前的准备工作
⦁ doInBackground():在后台执行异步任务。只有该方法在子线程中执行
⦁ onPostExecute():异步任务执行后的收尾工作
好了,下面是正文咯
1 如果需要网络,需要在AndroidManifest.xml中添加权限:
<uses-permission android:name="android.permission.INTERNET"/>
2.布局文件代码,这里咱们写了一个ImageView和Button控件:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.asynctask3_urlimage.MainActivity">
<ImageView
android:id="@+id/image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="点击开始下载"
android:onClick="btnClick"/>
</LinearLayout>
3.创建HttpUtils类做为工具类:
public class HttpUtils {
// 下载网络数据
public static byte[] getUrlData(String urlStr) {
try {
// 创建连接对象
URL url = new URL(urlStr);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// 设置连接参数
conn.setConnectTimeout(3000); // 设置超时时间 3s
conn.setDoInput(true); // 允许输入
conn.setRequestMethod("GET"); // 设置请求方式
// 开始下载
InputStream is = conn.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
while(true) {
int hasRead = is.read(buffer);
if(hasRead < 0) {
break;
}
baos.write(buffer, 0, hasRead);
}
return baos.toByteArray();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
4.创建一个异步任务类MyTask,并让他继承 AsyncTasK < Params, Progress, Result>,并重写doInBackground(),onPostExecute()方法:
public class MyTask extends AsyncTask<String, Void, byte[]> { //利用构造器传输数据
private ImageView imageView;
public MyTask(ImageView imageView) {
this.imageView = imageView;
}
// 子线程下载网络数据
@Override
protected byte[] doInBackground(String... params) {
String url = params[0];
byte[] data = HttpUtils.getUrlData(url);
return data;
}
// 主线程解码并显示图片
@Override
protected void onPostExecute(byte[] data) {
super.onPostExecute(data);
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
imageView.setImageBitmap(bitmap);
}
}
5.最后的是MainActivity.java:
public class MainActivity extends AppCompatActivity {
private ListView listview;
//网上找的图片的连接
private static final String URL = "http://imgsrc.baidu.com/image/c0%3Dshijue1%2C0%2C0%2C294%2C40/sign=407b2e95de3f8794c7f2406dba726481/a5c27d1ed21b0ef4c9eb5573d7c451da81cb3e98.jpg";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listview = (ListView) findViewById(R.id.listview);
// 加载数据
MyTask task = new MyTask();
task.setOnGetDataListener(new MyTask.OnGetDataListener() {
@Override
public void onGetData(List<Person> persons) {
// 把数据显示到listview上
MyAdapter adapter = new MyAdapter(MainActivity.this, persons);
listview.setAdapter(adapter);
}
});
task.execute(URL);
}
}
以上就是通过AsyncTask下载网络图片的代码就这些了,咱们这里就不贴上运行后的效果图了哈。
谢谢大家阅读,本文仅供参考,有疑问或错误请大家指出,谢谢。