Android——使用Handle和Message更新UI控件
2015-11-20 19:20
531 查看
最近在写一个使用Android端访问PCweb服务端的测试应用,需要在进行网络通信,而android网络通信需要异步执行,一开始是直接用AsyncTask的方法在MainActivity中写代码,一切正常,通过AsyncTask 的onPostExecute方法进行界面更新,但为了代码的可复用,采用将网络通信放到另外一个HttpUtils.java类中作为静态方法调用。此时出了一些问题:
1.不知道怎么将web端的输出结果返回给主线程的变量
2.在HttpUtils.java中声明静态字段,将结果先递给静态字段。但是在主线程中去这个字段时往往不是及时的。
所以在百度了一下之后,找到一种很普遍的方法:用handle 来处理异步线程的执行情况
具体流程:
1.在主线程中声明一个Handle(android.os),他有可以覆盖的一个方法handleMessage(Message msg)用于监听收到消息的事件,在这个方法里面可以进行UI的一些控件更新。
2.在异步方法执行的过程中,如果想要返回一些参数给主线程,那么通过发送一个Message的方式,传回参数,可以包含当前消息包含的类型,例如代表当前的消息是查询操作发出的。
3.在主线程中的Handle的handleMessage()中判断异步方法中是什么方法发出的消息。然后进行相关的操作
下面开始一个简单的例子
例如:我要进行一次http网络请求,请求结果放在StringBuilder中,要先新建一个线程去运行网络请求,在得到请求返回的数据后,将他包装到message中,再利用handle的send方法返回到UI线程中执行
。
在包类的其他java文件中写一个方法,这里我新建了一个HttpUtils.java类,里面的一些queryURL是自己本地搭的Apache服务器的PHP访问地址,用于对MySQL数据库进行相关操作.
在MainActivity中,也就是在UI线程中,定义了一个静态的Handle handle
在onCreate中初始化并重写handleMessage方法
在上面已经在HttpUtils的query方法中调用了handle.sendMessage().它会调用UI线程里handle的handleMessage()方法
所以在handleMessage()中可以这样处理:取得msg中的数据,分析type和result。
如果类型是query,代表是HttpUtils中的query()方法调用,用Toast显示结果,
这里想要简单测试直接把URL改为“Http://www.baidu.com“即可
1.不知道怎么将web端的输出结果返回给主线程的变量
2.在HttpUtils.java中声明静态字段,将结果先递给静态字段。但是在主线程中去这个字段时往往不是及时的。
所以在百度了一下之后,找到一种很普遍的方法:用handle 来处理异步线程的执行情况
具体流程:
1.在主线程中声明一个Handle(android.os),他有可以覆盖的一个方法handleMessage(Message msg)用于监听收到消息的事件,在这个方法里面可以进行UI的一些控件更新。
2.在异步方法执行的过程中,如果想要返回一些参数给主线程,那么通过发送一个Message的方式,传回参数,可以包含当前消息包含的类型,例如代表当前的消息是查询操作发出的。
3.在主线程中的Handle的handleMessage()中判断异步方法中是什么方法发出的消息。然后进行相关的操作
下面开始一个简单的例子
例如:我要进行一次http网络请求,请求结果放在StringBuilder中,要先新建一个线程去运行网络请求,在得到请求返回的数据后,将他包装到message中,再利用handle的send方法返回到UI线程中执行
。
在包类的其他java文件中写一个方法,这里我新建了一个HttpUtils.java类,里面的一些queryURL是自己本地搭的Apache服务器的PHP访问地址,用于对MySQL数据库进行相关操作.
package com.sky.firsthttpapp; import android.os.Bundle; import android.os.Message; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; /** * Created by Administrator on 2015/11/20. */ public class HttpUtils { public static String queryURL="/DataApplication/readData.php" ,deleteURL ="/DataApplication/deleteData.php?id=" ,updateURL="/DataApplication/updataData.php?" ,insertURL="/DataApplication/addData.php?"; public static URL creatURL(String urlStr,String Ip,String params){ URL url=null; try{ url=new URL("http://"+Ip+urlStr+params); } catch (MalformedURLException e) { Message msg=new Message(); Bundle b=new Bundle(); b.putString("type","exception"); b.putString("result","URL_Exception:"+e.getMessage()); msg.setData(b); MainActivity.handler.sendMessage(msg); } return url; } public static void query(String Ip){ final URL url=creatURL(queryURL,Ip,""); new Thread(){ public void run(){ StringBuilder result=new StringBuilder(); try { URLConnection connection=url.openConnection(); BufferedReader br=new BufferedReader( new InputStreamReader( connection.getInputStream())); String str=""; while((str=br.readLine())!=null){ result.append(str); } } catch (IOException e) { e.printStackTrace(); } //发送消息给UI线程的handle,消息里面包含结果,和消息type, Bundle b=new Bundle(); b.putString("type","query"); b.putString("result",result.toString()); Message msg=new Message(); msg.setData(b); MainActivity.handler.sendMessage(msg); } }.start(); } }
在MainActivity中,也就是在UI线程中,定义了一个静态的Handle handle
public static Handler handler;
在onCreate中初始化并重写handleMessage方法
handler=new Handler(){ //这是默认的方法 @Override public void handleMessage(Message msg) { super.handleMessage(msg); } };
在上面已经在HttpUtils的query方法中调用了handle.sendMessage().它会调用UI线程里handle的handleMessage()方法
所以在handleMessage()中可以这样处理:取得msg中的数据,分析type和result。
@Override public void handleMessage(Message msg) { Bundle b = msg.getData(); String type = b.getString("type"); String result = b.getString("result"); if(type=="query"){ Toast.makeText(MainActivity.this, result, Toast.LENGTH_SHORT).show(); } }
如果类型是query,代表是HttpUtils中的query()方法调用,用Toast显示结果,
这里想要简单测试直接把URL改为“Http://www.baidu.com“即可
相关文章推荐
- iOS开发中UIViewcontentMode的12种属性值
- ios的手势UIGestureRecognizer
- Android中UI线程与后台线程交互设计的5种方法
- 【iOS功能实现】之利用UIDocumentInteractionController打开和预览文档
- Leetcode: Binary Tree Longest Consecutive Sequence
- openstack message queue
- UILable上如何添加背景图片
- 动画特效十八:粘性动画2
- UIScrollView的delegate方法妙用之让UICollectionView滑动到某个你想要的位置
- ios--uitextfield动态限制输入的字数
- request.getRealPath不推荐使用request.getRealPath("") 这个方法已经不推荐使用了
- Packet for query is too large (41477246 > 167772). 数据库写入数据过大
- 分享功能使用的UIPopoverController在iOS9 过期,替换为popoverPresentationController
- Thread 暂停 继续(to be continued)
- iOS开发UI基础—手写控件,frame,center和bounds属性
- 获取iOS系统版本 --- UIDevice的使用
- UIPickerView的点滴
- adoquery 查询
- String、StringBuffer and StringBuilder
- 解决javax.persistence.TransactionRequiredException: Executing an update/delete query错误