安卓 OkHttp进阶使用(异步请求,传输Json、File对象)(28)

使用OkHttp实现更多功能(Get、Post异步请求、使用Post传输Json、File对象)

参考文章:https://blog.csdn.net/fightingXia/article/details/70947701

public class OkHttpGetAsyncActivity extends Activity {

    private final int OKHTTP_GET_SUCCESS = 0;
    private final int OKHTTP_GET_FAIL = 1;

    private Button send_http;
    private TextView get_http;
    String responseData;

    //接收OkHttp中发送的Message,根据不同的Message进行不同的UI操作
    Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what){
                case OKHTTP_GET_SUCCESS:
                    Toast.makeText(OkHttpGetAsyncActivity.this, "Success", Toast.LENGTH_SHORT).show();
                    get_http.setText(responseData);
                    break;
                case OKHTTP_GET_FAIL:
                    Toast.makeText(OkHttpGetAsyncActivity.this, "Failure", Toast.LENGTH_SHORT).show();
                    break;
                default:
                    break;
            }
        }
    };

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_ok_http);

        send_http = findViewById(R.id.send_Okhttp);
        get_http = findViewById(R.id.get_Okhttp);

        send_http.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //这里实现Get请求
//                getDataAsync();
                //这里实现Post请求(传递键值对参数)
//                getDataPostAsync();
                //这里实现Post请求(传递Json对象)
//                getDataPostJsonAsync();
                //这里实现Post请求(传递File对象)
                getDataPostFileAsync();
            }
        });
        get_http.setMovementMethod(new ScrollingMovementMethod());
    }

    private void getDataAsync() {
        //Get的异步请求不需要开启子线程,但是在其回调函数中还是在子线程中执行
        //所以更改UI还是需要在主线程中
        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder()
                .url("http://www.baidu.com")
                .build();
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                Message message = new Message();
                message.what = OKHTTP_GET_FAIL;
                handler.sendMessage(message);
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                if(response.isSuccessful()){
                    responseData = response.body().string();

                    Message message = new Message();
                    message.what = OKHTTP_GET_SUCCESS;
                    handler.sendMessage(message);
                }
            }
        });
    }

    private void getDataPostAsync() {
        //Post的异步请求不需要开启子线程,但是在其回调函数中还是在子线程中执行
        //所以更改UI还是需要在主线程中
        OkHttpClient client = new OkHttpClient();
        RequestBody requestBody = new FormBody.Builder()
                .add("arg1","123")
                .add("arg2","123456")
                .build();
        Request request = new Request.Builder()
                .url("http://www.baidu.com")
                .post(requestBody)
                .build();

        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                Message message = new Message();
                message.what = OKHTTP_GET_FAIL;
                Log.v("onFailure",message.what + "");
                handler.sendMessage(message);
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                Log.v("onResponse","onResponse ");
                //response.isSuccessful()这个布尔值代表的是,你使用Post请求过后,返回时是否成功
                //比如我们发送一个错误参数的Post请求,如果添加了response.isSuccessful(),那么他的条件语句不会触发,即response.isSuccessful() == false。
//                if(response.isSuccessful()){
                    responseData = response.body().string();

                    Message message = new Message();
                    message.what = OKHTTP_GET_SUCCESS;
                    handler.sendMessage(message);
//                }
            }
        });
    }

    private void getDataPostJsonAsync() {
        OkHttpClient client =  new OkHttpClient();
        //设置数据类型为JSON类型
        MediaType JSON = MediaType.parse("application/json; charset=utf-8");
        //JSON格式数据
        String jsonStr = "{\"arg1\":\"123456\",\"arg2\":\"525\"}";
        RequestBody requestBody = RequestBody.create(JSON, jsonStr);
        Request request = new Request.Builder()
                .url("http://www.baidu.com")
                .post(requestBody)
                .build();
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                Message message = new Message();
                message.what = OKHTTP_GET_FAIL;
                Log.v("onFailure",message.what + "");
                handler.sendMessage(message);
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                Log.v("onResponse","onResponse ");
                //response.isSuccessful()这个布尔值代表的是,你使用Post请求过后,返回时是否成功
                //比如我们发送一个错误参数的Post请求,如果添加了response.isSuccessful(),那么他的条件语句不会触发,即response.isSuccessful() == false。
//                if(response.isSuccessful()){
                responseData = response.body().string();

                Message message = new Message();
                message.what = OKHTTP_GET_SUCCESS;
                handler.sendMessage(message);
//                }
            }
        });
    }


    private void getDataPostFileAsync() {
        OkHttpClient client = new OkHttpClient();
        //设置一种File对象
        MediaType fileType = MediaType.parse("File/*");
        File file = new File("FilePath");
        RequestBody requestBody = RequestBody.create(fileType, file);
        Request request = new Request.Builder()
                .url("http://www.baidu.com")
                .post(requestBody)
                .build();
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                Message message = new Message();
                message.what = OKHTTP_GET_FAIL;
                Log.v("onFailure",message.what + "");
                handler.sendMessage(message);
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                Log.v("onResponse","onResponse ");
                //response.isSuccessful()这个布尔值代表的是,你使用Post请求过后,返回时是否成功
                //比如我们发送一个错误参数的Post请求,如果添加了response.isSuccessful(),那么他的条件语句不会触发,即response.isSuccessful() == false。
//                if(response.isSuccessful()){
                responseData = response.body().string();

                Message message = new Message();
                message.what = OKHTTP_GET_SUCCESS;
                handler.sendMessage(message);
//                }
            }
        });
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值