由于很多时候都需要进行网络访问,而且很多都是一样的,所以封装起来使用会更方便一些,并且由于网络访问不能在主线程进行,所以还需要开启一个子线程,但是由于子线程是在public void run 方法里面执行的,所以无法返回访问的内容,因此这时候就需要用到Callback了,定义一个接口叫HttpCallback,定义两个抽象方法,一个是访问成功时调用,一个是出现异常时调用。
public interface HttpCallbackListener {
//访问完成
void onFinish(String response);
//访问出错
void onError(Exception e);
}
HttpUtil
public class HttpUtil {
public static void sendHTTPRequest(final String address,final HttpCallbackListener listener){
new Thread(new Runnable() {
@Override
public void run() {
HttpURLConnection connection=null;
try {
connection=(HttpURLConnection) new URL(address).openConnection();
connection.setRequestMethod("GET");
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setReadTimeout(4000);
connection.setConnectTimeout(4000);
BufferedReader br=new BufferedReader(new InputStreamReader(connection.getInputStream()));
StringBuilder response=new StringBuilder();
String line="";
while((line=br.readLine())!=null){
response.append(line);
}
if(listener!=null){
listener.onFinish(response.toString());
}
} catch (Exception e) {
e.printStackTrace();
if(listener!=null){
listener.onError(e);
}
}finally{
if(connection!=null){
connection.disconnect();
}
}
}
}).start();
}
主界面调用
public class MainActivity extends Activity {
private Button mButton;
private TextView mShowTextView;
private Handler mHandler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
mButton=(Button) findViewById(R.id.main_Button);
mShowTextView=(TextView) findViewById(R.id.main_show_TextView);
mHandler=new Handler(){
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case 0123:
String response=(String) msg.obj;
mShowTextView.setText(response);
break;
default:
break;
}
};
};
mButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String url="http://www.baidu.com";
HttpUtil.sendHTTPRequest(url, new HttpCallbackListener() {
@Override
public void onFinish(String response) {
Message msg=mHandler.obtainMessage();
msg.what=0123;
msg.obj=response;
mHandler.sendMessage(msg);
}
@Override
public void onError(Exception e) {
}
});
}
});
}
}
因为onFinish和onError方法都是在子线程中执行的,所以无法进行UI更新,还是需要使用Handler进行主线程与子线程的通信,通知主线程更新UI。