最近在写一个使用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数据库进行相关操作.
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;