您的位置:首页 > 理论基础 > 计算机网络

Android低阶之【chapter - 6】Handler结合网络访问的使用方法,通过Handler实现异步网络请求

2016-10-17 17:01 871 查看

Android低阶之【chapter - 6】Handler结合网络访问的使用方法,通过Handler实现异步网络请求

本章讲到如何使用Handler结合网络请求实现,异步加载图片。

大致思路

主线程也称作UI线程,只准主线程更新UI,子线程不能更新UI,在android中耗时任务大于5秒,都会报ANR(Application Not Response)错误。解决ANR错误的方法是,将耗时任务(网络任务请求,数据库操作请求)由主线程交给子线程来运行.

声明一个Handler对象

重写handleMessage方法

创建一个声明Handler类对象

子线程创建一个Message对象,使用其属性发送信息

用sendmessage发送

在重写的HandleMessage中接受发送的消息

以下的code是从网上下载图片,并显示在app中,用到了Handler(子线程到主线程)

package com.example.yangjie.picture;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Handler;//有两个Handler包,别导错了
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ImageView;

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

public class MainActivity extends AppCompatActivity {
private ImageView mimageView ;
private BitmapHandler  mHandler ;

@Override
protected void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mimageView =(ImageView)findViewById(R.id.activity_iv_image);
mHandler =new BitmapHandler();

new Thread(){
@Override
public void run() {
Bitmap bitmap=  dowload("http://10.7.154.201:8080/teach/tools/adc.jpg" );
//http://10.7.154.201:8080/teach/tools/adc.jpg            //连接老师的服务器url
// http://pic1.nipic.com/2008-09-08/200898163242920_2.jpg  //连接网络地址url

Message msg= new Message();
msg.obj=bitmap;
mHandler.sendMessage(msg);
}
}.start();
}
private  class BitmapHandler extends Handler{
@Override
public void handleMessage(Message msg) {
Bitmap bitmap=(Bitmap)msg.obj;
mimageView.setImageBitmap(bitmap);

}
}

private Bitmap dowload(String urlstr){

try {
URL url=new URL(urlstr);
HttpURLConnection coon=(HttpURLConnection)url.openConnection();
if (coon.getResponseCode()==200 ){
InputStream is=coon.getInputStream();
ByteArrayOutputStream bao=new ByteArrayOutputStream();
int len=0 ;
byte[] buf=new byte[1024 ];
while((len=is.read(buf))!=-1){
bao.write(buf,0,len);
}

Bitmap bitmap=BitmapFactory.decodeByteArray(bao.toByteArray(), 0,bao.size());
return  bitmap;

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




Handler:负责消息的接受,然后处理消息

Message:消息的载体

MessageQueue:消息队列,消息共享,存放消息的数据

Looper:当前线程维护消息队列,循环遍历

以下的code是从(子线程到主线程)和从(主线程到子线程)

package com.example.yangjie.anrapp;

import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
private  final  static  String LOG_TAG="MainActivity";
private EditText mnumber1 ,mnumber2 ;
private Button btadd ,sendto ,startto ;
private TextView mresult ;

private  MessageHandler mhandler;
private  Handler  msenhandler;

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

mnumber1 =(EditText)findViewById(R.id.number1);
mnumber2 =(EditText)findViewById(R.id.number2);
btadd =(Button)findViewById(R.id.add);
sendto =(Button)findViewById(R.id.sendto);
startto =(Button)findViewById(R.id.startto);
mresult =(TextView)findViewById(R.id.result);

mhandler =new MessageHandler();

btadd .setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final int first = Integer. parseInt(mnumber1.getText().toString());
final int second = Integer. parseInt(mnumber2.getText().toString());
new Thread() {
@Override
public void run() {
int result = add( first, second);
Message msg = new Message();
msg. what = result;
mhandler.sendMessage(msg);
}
}.start();
}
});

***************************************************************************************************************

sendto .setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {

Message msg=new Message();
msg.obj="发送了消息到子线程" ;
msenhandler.sendMessage(msg);

}
});

***************************************************************************************************************

startto .setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Thread(){
@Override
public void run() {
Log. v(LOG_TAG,"YJ----->"+ "线程已启动" );
Looper. prepare();
msenhandler= new Handler(){
@Override
public void handleMessage(Message msg) {
Log. v(LOG_TAG,"YJ----->"+msg. obj);
}
};
Looper. loop();
//子线程用handleMessage接受消息,一定要用 Looper. prepare();     Looper. loop();
}

}.start();

}
});

}

private  class  MessageHandler extends Handler{
@Override
public void handleMessage(Message msg) {

int finalresult=msg.what;
mresult.setText(finalresult + "");

}
}

public  int  add(int a,int b){
return  (a+b);
}

}




重要公告

博主的github,有一些有意思的小东西,欢迎来打扰。(https://github.com/KellenHu
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐