您的位置:首页 > 理论基础 > 计算机网络

通过AsyncTask下载网络图片

2017-09-01 19:52 375 查看
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下载网络图片的代码就这些了,咱们这里就不贴上运行后的效果图了哈。

谢谢大家阅读,本文仅供参考,有疑问或错误请大家指出,谢谢。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  asynctask 网络