Android实战简易教程-第四十九枪(两种方式实现网络图片异步加载)
来源:互联网 发布:网络推广的工资 编辑:程序博客网 时间:2024/05/07 10:50
加载图片属于比较耗时的工作,我们需要异步进行加载,异步加载有两种方式:1.通过AsyncTask类进行;2.通过Handler来实现,下面我们就来看一下如何通过这两种方式实现网络图片的异步加载。
一、AsyncTask方式
1.main.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <ImageView android:id="@+id/img" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" /></RelativeLayout>
2.MainActivity.java:
package com.example.imageloaderdemo;import java.io.IOException;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.MalformedURLException;import java.net.ProtocolException;import java.net.URL;import android.app.Activity;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.AsyncTask;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.ImageView;public class MainActivity extends Activity {private ImageView mImageView;private static String URLSTRING;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mImageView = (ImageView) findViewById(R.id.img);URLSTRING="http://photocdn.sohu.com/20110927/Img320705637.jpg";//图片地址MyAsyncTask myAsyncTask=new MyAsyncTask();myAsyncTask.execute(URLSTRING);}class MyAsyncTask extends AsyncTask<String, Void, Bitmap> {@Overrideprotected void onPostExecute(Bitmap result) {super.onPostExecute(result);mImageView.setImageBitmap(result);}@Overrideprotected Bitmap doInBackground(String... params) {Bitmap bitmap=null;try {URL url=new URL(params[0]);HttpURLConnection connection=(HttpURLConnection) url.openConnection();connection.setRequestMethod("GET");connection.setConnectTimeout(5000);if(connection.getResponseCode()==200){InputStream inputStream=connection.getInputStream();bitmap=BitmapFactory.decodeStream(inputStream);}} catch (MalformedURLException e) {e.printStackTrace();} catch (ProtocolException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return bitmap;}}}
3.总结:
1.AsyncTask<String, Void, Bitmap>//三个参数,第一个为传入的URL,第二个表示中间状态的,这里传入空即可,第三个为返回值
2.doInBackground(String... params)方法新开了一个线程,AysncTask其他几个方法都在主线程中运行
3.除了doInBackground方法,其他方法都在主线程中运行,所以这里:
mImageView.setImageBitmap(result);可以直接设置
运行实例如下:
成功的加载了网络图片。
二、Handler方式
异步请求Bitmap,因为子线程无法更新主线程UI,所以必须通过Handler的方式进行图片渲染。
布局文件不变,下面我们看一下MainActivity.java:
package com.example.imageloaderdemo;import java.io.IOException;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.MalformedURLException;import java.net.ProtocolException;import java.net.URL;import android.app.Activity;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.widget.ImageView;public class MainActivity extends Activity {private ImageView mImageView;private static String URLSTRING;private Handler handler = new Handler() {public void handleMessage(Message msg) {Bitmap bitmap = (Bitmap) msg.obj;mImageView.setImageBitmap(bitmap);};};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mImageView = (ImageView) findViewById(R.id.img);URLSTRING = "http://photocdn.sohu.com/20110927/Img320705637.jpg";// 图片地址MyThread myThread = new MyThread();myThread.start();// 调用线程}class MyThread extends Thread {@Overridepublic void run() {super.run();Bitmap bitmap = null;try {URL url = new URL(URLSTRING);HttpURLConnection connection = (HttpURLConnection) url.openConnection();connection.setRequestMethod("GET");connection.setConnectTimeout(5000);if (connection.getResponseCode() == 200) {InputStream inputStream = connection.getInputStream();bitmap = BitmapFactory.decodeStream(inputStream);Message message = new Message();message.obj = bitmap;handler.sendMessage(message);}} catch (MalformedURLException e) {e.printStackTrace();} catch (ProtocolException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}}
总结:
1.新开一个线程用于网络数据的请求:
class MyThread extends Thread{}
2.通过sendMessage发送对象,通过handleMessage处理数据。
很简单啊,希望可以帮到初学者。
喜欢的朋友关注我!谢谢
2 0
- Android实战简易教程-第四十九枪(两种方式实现网络图片异步加载)
- Android实战简易教程<四十九>(两种方式实现网络图片异步加载)
- Android实战简易教程-第七十一枪(异步网络下载网络图片及图片廊制作)
- Android实战简易教程-第二十九枪(基于Face++实现年龄识别APP(一))
- Android实战简易教程-第六十九枪(自定义控件实现雪花飘落效果)
- Android实战简易教程-第六十九枪(自定义控件实现雪花飘落效果)
- Android简易实战教程--第二十九话《创建图片副本》
- Android简易实战教程--第三十九话《Chronometer实现倒计时》
- Android简易实战教程--第四十七话《使用OKhttp回调方式获取网络信息》
- Android实战简易教程-第四十七枪(ListView多选-实现点餐系统)
- Android实战简易教程-第四十八枪(App引导页面效果实现)
- Android实战简易教程<二十九>基于Face++实现年龄识别APP(一))
- Android简易实战教程--第四十九话《满屏拖动的控件》
- android多种方式实现异步加载图片
- android Gallery实现异步加载网络图片
- Android简易实战教程--第四十五话《几种对话框》
- 图片异步加载和图片缓存的两种方式
- Android实战简易教程-第五十三枪(通过实现OnScrollListener接口实现上拉加载更多功能)
- android 编程
- [Decode error - output not cp1252][Decode error - output not utf-8]
- 入理解最强桌面地图控件GMAP.NET ---离线地图
- Android扫描二维码及生成二维码Demo
- django多语言支持
- Android实战简易教程-第四十九枪(两种方式实现网络图片异步加载)
- HMM学习最佳范例四:隐马尔科夫模型
- 欢迎使用CSDN-markdown编辑器
- Centos6 安装zabbix-server
- 为openstack制作windows镜像
- Linux下的利器——supervise
- 【c++ Primer stringstream流总结】
- Linux makefile教程-详细易懂
- 对项目管理的几点认识