Android-handler.post和handlemessage的使用对比(下载图片)
2017-05-04 22:20
288 查看
1、网络权限:
<uses-permission android:name="android.permission.INTERNET" />
2、布局:
<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/imgview" android:layout_width="match_parent" android:layout_height="match_parent" android:scaleType="centerInside" android:src="@mipmap/ic_launcher" /> </RelativeLayout>
3.1、使用sendmessage方法下载图片
可加进度条、sendMessage(Message)package com.example.administrator.downloadimage; import android.app.ProgressDialog; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.widget.ImageView; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.util.EntityUtils; import java.io.IOException; /** * Created by Administrator on 2017/5/4. */ public class HandleMessageActivity extends AppCompatActivity { private ImageView imgview; private ProgressDialog pDialog; private String url = "http://litchiapi.jstv.com/Attachs/Top/11949/e650e0201de541d2ba91dca202b0fcfe.jpg"; private Handler handler = new Handler() { public void handleMessage(android.os.Message msg) { switch (msg.what) { case 0: pDialog.show(); break; case 1: imgview.setImageBitmap((Bitmap) msg.obj); break; case 2: pDialog.dismiss(); break; } } }; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main1); imgview = (ImageView) this.findViewById(R.id.imgview); pDialog = new ProgressDialog(this); //下载提示对话框 pDialog.setIcon(R.mipmap.ic_launcher); pDialog.setTitle("提示"); pDialog.setMessage("The picture is loading..."); new Thread(new Runnable() { //主线程中用Thread开辟子线程,Runnable只是一个接口 @Override public void run() { // 1 发送空消息,显示进度对话框 handler.sendEmptyMessage(0); // 2 下载操作 byte[] data = download(url); Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); Message message = Message.obtain(); //创建信息 //尽管Message有public的默认构造方法, // 但是应该通过Message.obtain()来从消息池中获得空消息对象,以节省资源。 // 通过调用obtainMessage方法获取Message对象就能避免创建对象,从而减少内存的开销了。 message.obj = bitmap; //如果你的message只需要携带简单的int信息, // 请优先使用Message.arg1和Message.arg2来传递信息,这比用Bundle更省内存. message.what = 1; //擅用message.what来标识信息,以便用不同方式处理message。 handler.sendMessage(message);// 关键方法:sendMessage // 3 发送空消息,关闭进度对话框 handler.sendEmptyMessage(2); } }).start(); } public byte[] download(String url) { try { HttpClient client = new DefaultHttpClient(); HttpGet get = new HttpGet(url); HttpResponse response = client.execute(get); if (response.getStatusLine().getStatusCode() == 200) { return EntityUtils.toByteArray(response.getEntity()); } } catch (IOException e) { e.printStackTrace(); } return null; } }
3.2 使用post下载图片
: post(Runnable)package com.example.administrator.downloadimage; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; import android.os.Handler; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.widget.ImageView; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.util.EntityUtils; import java.io.IOException; /** * Created by Administrator on 2017/5/4. */ public class HandlerPostActivity extends AppCompatActivity { private ImageView imgview; private String url = "http://litchiapi.jstv.com/Attachs/Top/11949/e650e0201de541d2ba91dca202b0fcfe.jpg"; private Handler handler = new Handler(); @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main1); imgview = (ImageView) this.findViewById(R.id.imgview); // 工作线程 new Thread(new Runnable() { @Override public void run() {// 子线程:下载数据 Log.i("MainActivity", "first:" + Thread.currentThread().getName()); //获取当前线程的名字 // 下载数据 byte[] data = download(url); final Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); // handler与绑定的主线程提交一个任务 handler.post(new Runnable() {// 关键方法:post @Override public void run() {// 主线程:更新UI Log.i("MainActivity", "second:" + Thread.currentThread().getName()); imgview.setImageBitmap(bitmap); } }); } }).start(); } public byte[] download(String url) { //下载方法 try { HttpClient client = new DefaultHttpClient(); HttpGet get = new HttpGet(url); HttpResponse response = client.execute(get); if (response.getStatusLine().getStatusCode() == 200) { return EntityUtils.toByteArray(response.getEntity()); } } catch (IOException e) { e.printStackTrace(); } return null; } }
相关文章推荐
- 【黑马Android】(05)短信/查询和添加/内容观察者使用/子线程网络图片查看器和Handler消息处理器/html查看器/使用HttpURLConnection采用Post方式请求数据/开源项目
- Android中使用HttpURLConnection实现GET POST JSON数据与下载图片
- Android中使用HttpURLConnection实现GET POST JSON数据与下载图片
- Android开发之使用Handler封装下载图片工具类(源码分享)
- Android中如何使用HttpURLConnection实现GET POST JSON数据与下载图片
- Android中使用HttpURLConnection实现GET POST JSON数据与下载图片
- Android中使用HttpURLConnection实现GET POST JSON数据与下载图片
- Android开发之使用Handler封装下载图片工具类(源代码分享)
- Android异步下载网络图片(其一:Handler)
- Java和Android Http连接程序:使用java.net.URL 下载服务器图片到客户端
- 在android中使用AsyncTask从网络中下载图片,但是调用了execute方法后,最后不执行onPostExcute方法
- 82 Android Handler 下载网络图片
- Android使用HttpClient下载图片
- [Android] PorterDuff使用实例----实现新浪微博图片下载效果
- Android使用HttpURLConnection下载图片
- Android--使用Http向服务器发送请求并取得返回结果,下载图片
- [Android] PorterDuff使用实例----实现新浪微博图片下载效果
- Android使用HttpURLConnection下载图片
- Java和Android Http连接程序:使用java.net.URL 下载服务器图片到客户端
- Android多线程——Handler (一) 实现图片下载