Android动态加载网络图片

动态加载网络图片

和 WebView 一样,加载网络图片也需要网络访问权限:

<uses-permission android:name="android.permission.INTERNET" />

载入图片的原理:根据图片地址获取图片,并将图片由文件流转换为位图对象。
载入图片的过程必须进行异步处理,否则就很容易出现程序无响应(Application Not Responding)的情况。
创建一个 LoadImagesTask 类,继承自 AsyncTask:

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.widget.ImageView;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class LoadImagesTask extends AsyncTask<String, Void, Bitmap> {
    private ImageView imageView;

    public LoadImagesTask(ImageView imageView) {
        this.imageView = imageView;
    }

    @Override
    protected Bitmap doInBackground(String... params) {
        URL imageUrl = null;
        Bitmap bitmap = null;
        InputStream inputStream = null;
        try {
            imageUrl = new URL(params[0]);
            HttpURLConnection conn = (HttpURLConnection) imageUrl.openConnection();
            conn.setDoInput(true);
            conn.connect();
            inputStream = conn.getInputStream();
            bitmap = BitmapFactory.decodeStream(inputStream);
            inputStream.close();

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return bitmap;
    }

    @Override
    protected void onPostExecute(Bitmap bitmap) {
        imageView.setImageBitmap(bitmap);
    }
}

异步处理就是在主线程和子线程进行通信,子线程处理耗时任务,并将结果返回到主线程。AsyncTask 将这个过程进行了包装,这里我就不多解释了。

最后在 MainActivity 中进行测试,代码如下:

public class MainActivity extends AppCompatActivity {
    private ImageView imageView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.web_image);

        String http = "http://img4.duitang.com/uploads/item/" +
                "201403/27/20140327194516_SaKBX.png";
        ImageView imageView = (ImageView) findViewById(R.id.image_view);
        //启动异步任务,加载网络图片
        new LoadImagesTask(imageView).execute(http);
    }
}

猜你喜欢

转载自www.cnblogs.com/huckleberry/p/12714463.html