动态加载网络图片
和 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); } }