使用Handler实现简单的Android异步请求框架
为了避免卡顿等问题,Android中不允许在子线程中更新UI,这给开发过程中带来了一点小障碍,为了解决这个问题,有几种方法可以使用
1、使用StrictMode强制在子线程中更新UI
这种方式简单粗暴,会带来肉眼可见的延迟,不建议使用
2、使用runOnUiThread更新
这种方式也比较简单,和创建子线程的写法几乎一致
runOnUiThread(new Runnable() {
@Override
public void run() {
//ToDo
}
});
3、使用AsyncTask更新UI
这种方式需要继承AsyncTask类,并重写其中几个方法,可以在里面更新UI
但是实现还是有点复杂的
public class TT extends AsyncTask<String,Integer,String> {
@Override
protected String doInBackground(String... strings) {
return null;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
}
@Override
protected void onProgressUpdate(Integer... values) {
//ToDo
super.onProgressUpdate(values);
}
}
4、使用Handler机制实现更新UI
这其中有一大类方式,具体可以参考文献:
https://blog.csdn.net/qq_26287435/article/details/65448951
原理可以参考:
https://blog.csdn.net/silleyj/article/details/55006573
5、使用Handler机制封装简单的异步Http请求框架
利用handler机制,我们可以封装自己的异步请求框架,更新UI,只需要一个接口和一个工具类。
首先是定义一个异步请求接口:
public interface AsyncHttpRequestListener {
void onSuccess(String result);
void onFailed(String reason);
}
然后是主体部分:
public class AsyncHttpHelper {
private static final int REQUEST_OK=0;
private static final int REQUEST_FAILURE=1;
private AsyncHttpRequestListener listener;
private String result;
private Handler handler=new Handler(){
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
switch (msg.what){
case REQUEST_OK:
listener.onSuccess(result);
break;
case REQUEST_FAILURE:
listener.onFailed(result);
break;
default :
break;
}
}
};
public AsyncHttpHelper(AsyncHttpRequestListener listener) {
this.listener = listener;
}
public void doGet(final String link){
new Thread(new Runnable() {
@Override
public void run() {
try {
URL url=new URL(link);
HttpURLConnection conn=(HttpURLConnection)url.openConnection();
conn.setConnectTimeout(4000);
conn.setRequestMethod("GET");
conn.setRequestProperty("User-Agent","Android");
BufferedReader reader=new BufferedReader(new InputStreamReader(conn.getInputStream(),"utf-8"));
StringBuilder sb=new StringBuilder();
String line;
while ((line=reader.readLine())!=null){
sb.append(line);
}
result=sb.toString();
Message message=new Message();
message.what=REQUEST_OK;
handler.sendMessage(message);
} catch (Exception e) {
result=e.toString();
Message message=new Message();
message.what=REQUEST_FAILURE;
handler.sendMessage(message);
}
}
}).start();
}
}
在请求完成之后,使用Handler机制通知,然后回调即可
public class MainActivity extends AppCompatActivity {
private TextView tv_hello_world;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_hello_world=(TextView)findViewById(R.id.tv_hello_world);
AsyncHttpHelper helper=new AsyncHttpHelper(new AsyncHttpRequestListener() {
@Override
public void onSuccess(String result) {
tv_hello_world.setText(result);
}
@Override
public void onFailed(String reason) {
tv_hello_world.setText("网络请求失败,失败原因:"+reason);
}
});
helper.doGet("https://h5.zuimeitianqi.com/h5Server/index?cityId=01010101");
}
}