通过AsyncTask下载网络图片

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下载网络图片的代码就这些了,咱们这里就不贴上运行后的效果图了哈。


谢谢大家阅读,本文仅供参考,有疑问或错误请大家指出,谢谢。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值