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)
相关文章推荐
- Android--使用原生技术实现ListView(原生技术实现网络异步请求,解析json数据)
- 10_Android中通过HttpUrlConnection访问网络,Handler和多线程使用,读取网络html代码并显示在界面上,ScrollView组件的使用
- 10_Android中通过HttpUrlConnection访问网络,Handler和多线程使用,读取网络html代码并显示在界面上,ScrollView组件的使用
- Android中使用HttpURLConnection和HttpClient实现GET和POST请求访问网络
- 使用RxAndroid配合MVP模式实现异步网络请求,更新ui
- Android HTTP实例 使用GET方法和POST方法发送请求(通过Apache接口实现)
- ListView异步加载图片是非常实用的方法,凡是是要通过网络获取图片资源一般使用这种方法比较好,用户体验好,下面就说实现方法,先贴上主方法的代码:
- 转载 通过JAVA语言实现使用URL访问网络资源
- ANDROID笔记:基于handle的异步请求网络数据的一种方法
- android通过webservice进行网络编程,使用工具类实现
- 在C#中使用异步Socket编程实现TCP网络服务的C/S的通讯构架(二)----使用方法
- Android底层开发中通过网络使用adb的方法
- 在C#中使用异步Socket编程实现TCP网络服务的C/S的通讯构架(二)----使用方法
- Android 通过WebService进行网络编程,使用工具类轻松实现
- handler的使用---如何实现Android计时与倒计时的几种方法
- 在C#中使用异步Socket编程实现TCP网络服务的C/S的通讯构架(二)----使用方法
- Android学习指南之三十:使用URLConnection和HttpClient访问网络的方法
- handler的使用---如何实现Android计时与倒计时的几种方法
- Android Volley网络请求框架 实现post方法并带Map参数上传