Hanlder的使用方法
1. 创建Handler成员变量对象,并重写其handleMessage()方法
2. 在分/主线程创建Message对象
3. 使用handler对象发送Message
4. 主线程,在hanlerMessage()中处理消息
Handler的原理
运行效果图
点击GET Submit1进行普通的同步工作
点击GET Submit2使用Handler进行异步工作
实现代码
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.administrator.handlerexcise.MainActivity">
<ProgressBar
android:id="@+id/pb_handler_loading"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="invisible"
android:layout_gravity="center"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="getSubmit1"
android:text="GET Submit1"
android:textAllCaps="false" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="getSubmit2"
android:text="GET Submit2"
android:textAllCaps="false" />
<EditText
android:id="@+id/et_handler_result"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/et_bg"
android:hint="显示结果"/>
</LinearLayout>
MainActivity
package com.example.administrator.handlerexcise;
import android.graphics.Path;
import android.net.Uri;
import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.ProgressBar;
import com.google.android.gms.appindexing.Action;
import com.google.android.gms.appindexing.AppIndex;
import com.google.android.gms.appindexing.Thing;
import com.google.android.gms.common.api.GoogleApiClient;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
/**
* @author thinkdoor
*
* 测试Handler的基本使用
1. 创建Handler成员变量对象,并重写其handleMessage()方法
2. 在分/主线程创建Message对象
3. 使用handler对象发送Message
4. 主线程,在hanlerMessage()中处理消息
*/
public class MainActivity extends AppCompatActivity {
ProgressBar progressBar;
EditText editText;
//创建Handler成员变量对象,并重写其handleMessage()方法,匿名内部类
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) { //在主线程执行
//主线程,在hanlerMessage()中处理消息
if(msg.what == 1) {
String result = msg.obj.toString();
editText.setText(result);
progressBar.setVisibility(View.INVISIBLE);
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
progressBar = (ProgressBar) findViewById(R.id.pb_handler_loading);
editText = (EditText) findViewById(R.id.et_handler_result);
}
/*
* 不使用Handler实现异步工作
1. 主线程,显示提示视图ProgressBar
2. 子线程,联网请求,并得到响应数据
3. 主线程,显示数据,因此提示视图
*/
public void getSubmit1(final View view) {
//1. 主线程,显示提示视图ProgressBar
progressBar.setVisibility(View.VISIBLE);
//2. 子线程,联网请求,并得到响应数据
new Thread() {
@Override
public void run() {
super.run();
String path = "https://www.baidu.com/";
//调用requestToString方法,得到服务器响应的字符串
try {
final String request = requestToString(path);
//3. 主线程,显示数据
runOnUiThread(new Runnable() {
@Override
public void run() {
editText.setText(request);
//隐藏提示视图
progressBar.setVisibility(View.INVISIBLE);
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}
/**
* 使用Handler实现异步工作
* @param view
*/
public void getSubmit2(View view) {
//1). 主线程,显示提示视图ProgressBar
progressBar.setVisibility(View.VISIBLE);
//2). 子线程,联网请求,并得到响应数据
new Thread(){
@Override
public void run() {
String path = "https://www.baidu.com/";
try {
String result = requestToString(path);
//2.在分/主线程创建Message对象
Message message = Message.obtain();
message.what = 1;
message.obj = result;
//使用handler对象发送Message
handler.sendMessage(message);
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
//3). 主线程,显示数据,因此提示视图
}
/**
* 请求服务器,得到返回结果字符串
*
* @param path:要访问的服务器路径
* @return String
* @throws Exception
*/
public String requestToString(String path) throws Exception {
//创建流和连接
InputStream inputStream = null;
ByteArrayOutputStream baos = null;
HttpURLConnection connection = null;
String result = null;
try {
//1.获得连接
URL url = new URL(path);
connection = (HttpURLConnection) url.openConnection();
//2.设置配置
connection.setRequestMethod("GET");
connection.setConnectTimeout(5000);
connection.setReadTimeout(6000);
//3.连接
connection.connect();
//4.发送请求,响应200进行读取
int responseCode = connection.getResponseCode();
if (responseCode == 200) {
// 得到InputStream,并读取成String
inputStream = connection.getInputStream();
baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = -1;
while ((len = inputStream.read(buffer)) != -1) {
baos.write(buffer, 0, len);
}
result = baos.toString();
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
//7) 关闭流,断开连接
try {
baos.close();
inputStream.close();
connection.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
return result;
}
}
当然还有网络授权
<!--网络权限-->
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<application
需要打包的项目文件请留言
觉得有用的话,点个赞和关注吧,博主会坚持写更实用易懂的博文