OKhttp请求网络

/**

  • OKHttp3

  • 网络处理框架 处理网络接口

  • 1:导入依赖 com.squareup.okhttp3:okhttp:3.12.0(搜索:okhttp)

  • OKHttp3处理网络有两种方式

  • 1:同步 execute get和post 必须要放在子线程中

  • 2:异步 enqueue
    */
    public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Button Send_Btn;
    private TextView Tv_Get;
    private String mUrl = “http://www.zhaoapi.cn/home/getHome”;
    private String mPostUrl = “http://www.zhaoapi.cn/user/login”;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    initView();
    }

    private void initView() {
    Send_Btn = (Button) findViewById(R.id.Send_Btn);
    Tv_Get = (TextView) findViewById(R.id.Tv_Get);

     Send_Btn.setOnClickListener(this);
    

    }

    @Override
    public void onClick(View v) {
    switch (v.getId()) {
    case R.id.Send_Btn:
    // sendNet();
    // sendPost();
    // asyncSend();
    // asyncPost();
    utilsGet();
    break;
    }
    }

    //同步处理get方式 必须放在子线程里
    private void sendNet() {
    new Thread(new Runnable() {
    @Override
    public void run() {

             try {
                 //1:new出一个对象来
                 OkHttpClient okHttpClient = new OkHttpClient();
                 //Request就是请求的类
                 Request request = new Request.Builder().url(mUrl).build();
                 //发送请求newCall方法
                 Call call = okHttpClient.newCall(request);
                 //通过call去处理给你响应Response
                 Response response = call.execute();
                 //从相应体里面拿到数据
                 String string = response.body().string();
                 Log.e("string", string);
             } catch (IOException e) {
                 e.printStackTrace();
             }
    
         }
     }).start();
    

    }

    //同步处理POST方式
    private void sendPost() {
    new Thread(new Runnable() {
    @Override
    public void run() {
    try {
    //1:new出一个对象来
    OkHttpClient okHttpClient = new OkHttpClient();
    //创建请求体
    RequestBody requestBody = new FormBody.Builder()
    .add(“mobile”, “18513426687”)
    .add(“password”, “123456”)
    .build();
    //Request就是请求的类
    Request request = new Request.Builder().url(mPostUrl).post(requestBody).build();
    //发送请求newCall方法
    Call call = okHttpClient.newCall(request);
    //通过call去处理给你响应Response
    Response response = call.execute();
    final String string = response.body().string();
    runOnUiThread(new Runnable() {
    @Override
    public void run() {
    Toast.makeText(MainActivity.this, string, Toast.LENGTH_SHORT).show();
    }
    });
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }).start();
    }

    //异步的Get方式
    private void asyncSend() {
    OkHttpClient okHttpClient = new OkHttpClient();
    final Request request = new Request.Builder().url(mUrl).build();
    Call call = okHttpClient.newCall(request);
    //异步处理
    call.enqueue(new Callback() {
    @Override
    public void onFailure(Call call, IOException e) {
    Log.e(“onFailure”, “onFailure”);
    }

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

// Toast.makeText(MainActivity.this, string, Toast.LENGTH_SHORT).show();
//一个小知识 不建议使用 在子线程直接刷新UI操作
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, string, Toast.LENGTH_SHORT).show();
}
});
}
});
}

//异步POST
private void asyncPost() {
    OkHttpClient okHttpClient = new OkHttpClient();

    RequestBody body = new FormBody.Builder()
            .add("mobile", "18513426687")
            .add("password", "123456").build();
    //链式调用
    Request request = new Request.Builder().url(mPostUrl).post(body).build();
    okHttpClient.newCall(request).enqueue(new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {
            Log.e("onFailure", "onFailure");
        }

        @Override
        public void onResponse(Call call, Response response) throws IOException {
            final String string = response.body().string();
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(MainActivity.this, string, Toast.LENGTH_SHORT).show();
                }
            });
        }
    });
}

//下边的代码都采用工具类调用
private void utilsGet() {
    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                final String jsonStr = OkHttpUtils.getInstance().get(mUrl);
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(MainActivity.this, jsonStr, Toast.LENGTH_SHORT).show();
                    }
                });
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }).start();
}

}

/**

  • 封装工具类

  • 需要用到单例设计模式

  • 1:懒汉式

  • 2:饿汉式

  • 3:DCL

  • 4:容器模式(前面三种都不是很完善的处理单例)

  • 单例模式:保证这个内存空间里面只能有实例

  • 1:私有化构造器? 保证其他类不能创建实例

  • 2:想到了这个实例在这个内存空间还要提供给别的类使用所以要封装成一个方法让人调用
    */
    public class OkHttpUtils {
    private OkHttpClient mOkHttpClient;

    private OkHttpUtils() {
    mOkHttpClient = new OkHttpClient();
    }

    public static OkHttpUtils getInstance() {
    return OkHttpHolder.utils;
    }

    static class OkHttpHolder {
    private static final OkHttpUtils utils = new OkHttpUtils();
    }

    //封装同步的Get请求方式
    public String get(String url) throws IOException {
    Request request = new Request.Builder().url(url).build();
    Response execute = mOkHttpClient.newCall(request).execute();
    return execute.body().string();
    }

//异步POST
public void postAsync(String url, Callback callback){
RequestBody body = new FormBody.Builder().add(“key”, “value”).build();
Request request = new Request.Builder().url(url).post(body).build();
okHttpClient.newCall(request).enqueue(callback);
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值