使用Handler机制实现简单的Http异步请求

使用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");
    }

}
发布了28 篇原创文章 · 获赞 9 · 访问量 2422

猜你喜欢

转载自blog.csdn.net/qq_23594799/article/details/104481588