您的位置:首页 > 移动开发 > Android开发

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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐