Android网络开发之OkHttp--基本用法GET

1、OkHttp框架使用了OkIo.jar包,不要忘记添加。

2、对于Request对象是如何实例化的,大家可以参考--java builder设计模式

http://www.cnblogs.com/moonz-wu/archive/2011/01/11/1932473.html

3、通过同步GET访问网络,主要分为四步:

     (1)、声明并实例化一个OkHttpClient对象。

     (2)、声明并实例化一个Request对象,并设置URL等参数。

     (3)、执行Request请求,并获得一个Response对象。

     (4)、根据Response的isSuccessful()方法,判断是否成功,然后从Response对象中获取返回数据。

4、通过异步GET访问网络和同步GET是一样的,不过处理返回数据实在CallBack接口中实现的。

5、

public class GetActivity extends Activity {
    private final OkHttpClient client = new OkHttpClient();

    private TextView mTvGet;

    private String result;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_get);

        initView();

        new Thread(getThread).start();
    }

    public void initView() {
        mTvGet = (TextView) findViewById(R.id.tv_get_show);
    }

    private Runnable getThread = new Runnable() {
        public void run() {
            try {
                getRun2();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        };
    };

    /** 同步GET */
    public void getRun() throws Exception {
        // 实例化请求对象
        Request request = new Request.Builder().url("https://www.baidu.com/").build();
        // 得到返回对象
        Response response = client.newCall(request).execute();

        // 判断返回对象是否成功
        if (!response.isSuccessful()) {
            result += "请求出错!";
        } else {
            // 输出Headers
            Headers responseHeaders = response.headers();
            for (int i = 0; i < responseHeaders.size(); i++) {
                result += responseHeaders.name(i) + "" + responseHeaders.value(i);
            }
            // 输出Body
            result += response.body().string();
        }

        getHandler.sendEmptyMessage(0);
    }

    /** 异步GET */
    public void getRun1() throws Exception {
        Request request = new Request.Builder().url("https://www.baidu.com/").build();
        client.newCall(request).enqueue(new Callback() {

            @Override
            public void onResponse(Response response) throws IOException {
                // 判断返回对象是否成功
                if (!response.isSuccessful()) {
                    result += "请求出错!";
                } else {
                    // 输出Headers
                    Headers responseHeaders = response.headers();
                    for (int i = 0; i < responseHeaders.size(); i++) {
                        result += responseHeaders.name(i) + "" + responseHeaders.value(i);
                    }
                    // 输出Body
                    result += response.body().string();
                }

                getHandler.sendEmptyMessage(0);
            }

            @Override
            public void onFailure(Request arg0, IOException e) {
                // TODO Auto-generated method stub
                e.printStackTrace();
            }
        });
    }

    private Handler getHandler = new Handler() {
        public void handleMessage(Message msg) {
            mTvGet.setText(result);
        };
    };
}

6、访问网络不能在主线程中进行,还有不要忘记加入访问网络的权限。

<uses-permission android:name="android.permission.INTERNET" />

7、参考博文:

http://www.2cto.com/kf/201505/397557.html

原文地址:https://www.cnblogs.com/begin1949/p/4927494.html