okhttp是个不错的网络框架,我先说下我们项目的网络架构吧,主要就是okhttp,Gson还有EventBus三者串联起来,再加上对应的封装,就可以实现网络请求相关的业务逻辑了。
okhttp负责请求的发送和接收,Gson负责json数组的解析和转换,EventBus负责将返回的返回体发送到ui层,然后进行ui的绘制。下面简单说下okhttp几个必须步骤吧,以get请求为例,具体的代码我会在下面贴上。
//1.获取okhttpClient对象
OkHttpClient okHttpClient = new OkHttpClient();
//2.构建request
Request.Builder builder = new Request.Builder();
final Request request = builder.get().url("https://www.baidu.com").build();
//3.将request封装成Call
Call call = okHttpClient.newCall(request);
//4.执行Call,这里是异步的,还有同步的,用的比较少
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.d(TAG, "onFailure " + "call = " + call.toString());
}
@Override
public void onResponse(Call call, final Response response)
throws IOException {
Log.d(TAG, "onResponse = " + response.body().toString());
//这里不能直接刷新数据,这个callBack还是在子线程中的
runOnUiThread(new Runnable() {
@Override
public void run() {
textview.setText(response.body().toString() + "");
}
});
}
});
先上传我gradle配置吧,自己写的demo代码,还用了注解的工具类。
buildscript {
repositories {
mavenCentral()
}
dependencies {
// replace with the current version of the Android plugin
classpath "com.android.tools.build:gradle:2.3.0"
}
}
repositories {
mavenCentral()
mavenLocal()
}
apply plugin: "com.android.application"
def AAVersion = '4.3.1'
dependencies {
annotationProcessor "org.androidannotations:androidannotations:$AAVersion"
compile "org.androidannotations:androidannotations-api:$AAVersion"
compile 'com.android.support:appcompat-v7:24.2.1'
compile 'com.squareup.okhttp3:okhttp:3.8.1'
compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.google.code.gson:gson:2.8.1'
}
android {
compileSdkVersion 24
buildToolsVersion "25.0.2"
defaultConfig {
minSdkVersion 9
targetSdkVersion 25
// If you have different applicationIds for buildTypes or productFlavors uncomment this block.
//javaCompileOptions {
// annotationProcessorOptions {
// arguments = ['resourcePackageName': android.defaultConfig.applicationId]
// }
//}
}
}
下面贴一个activity,里面有okhttp的简单使用。
package org.androidannotations.sample;
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.Window;
import android.widget.Button;
import android.widget.TextView;
import com.google.gson.Gson;
import org.androidannotations.annotations.Click;
import org.androidannotations.annotations.EActivity;
import org.androidannotations.annotations.ViewById;
import org.androidannotations.sample.bean.LoginRequestBean;
import org.androidannotations.sample.bean.LoginResponse;
import java.io.File;
import java.io.IOException;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
@EActivity(R.layout.activity_ok_http)
public class OkHttpActivity extends Activity {
private static final String TAG = "OkHttpActivity";
@ViewById(R.id.get)
Button get;
@ViewById(R.id.send)
Button send;
@ViewById(R.id.textview)
TextView textview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
}
@Click(R.id.get)
void get() {
//1.获取okhttpClient对象
OkHttpClient okHttpClient = new OkHttpClient();
//2.构建request
Request.Builder builder = new Request.Builder();
final Request request = builder.get().url("https://www.baidu.com").build();
//3.将request封装成Call
Call call = okHttpClient.newCall(request);
//4.执行Call,这里是异步的,还有同步的,用的比较少
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.d(TAG, "onFailure " + "call = " + call.toString());
}
@Override
public void onResponse(Call call, final Response response)
throws IOException {
Log.d(TAG, "onResponse = " + response.body().toString());
//这里不能直接刷新数据,这个callBack还是在子线程中的
runOnUiThread(new Runnable() {
@Override
public void run() {
textview.setText(response.body().toString() + "");
}
});
}
});
}
@Click(R.id.send)
void send() {
OkHttpClient okHttpClient = new OkHttpClient();
//以表单形式上传参数
FormBody.Builder build = new FormBody.Builder();
RequestBody requestBody = build.add("key", "value").add("key2", "value2").build();
Request.Builder builder = new Request.Builder();
Request request = builder.url("服务端地址").post(requestBody).build();
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.d(TAG, "onFailure " + "call = " + call.toString());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.d(TAG, "onResponse = " + response.body().toString());
}
});
}
/**
* 请求体为String类型的json数组
*/
public void doPostString() {
OkHttpClient okHttpClient = new OkHttpClient();
//配合gson转换成json数组,bean对象和gson这块都可以再度封装
final Gson gson = new Gson();
LoginRequestBean loginRequestBean = new LoginRequestBean();
loginRequestBean.setIp("10.20.51.65");
loginRequestBean.setCarrierId("201");
loginRequestBean.setPassword("123");
loginRequestBean.setUserId("001");
String params = gson.toJson(loginRequestBean);
RequestBody requestBody=RequestBody.create(MediaType.parse("text/plain;chaset=utf-8"),params);
Request.Builder builder = new Request.Builder();
Request request = builder.url("服务端地址").post(requestBody).build();
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.d(TAG, "onFailure " + "call = " + call.toString());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.d(TAG, "onResponse = " + response.body().toString());
//可以用gson直接转换成对应的javaBean对象。
LoginResponse loginResponse = gson.fromJson(response.body().toString(),LoginResponse.class);
}
});
}
/**
* 提交file到服务端
*/
public void doPostFile() {
//权限被忘了添加
File file = new File(Environment.getExternalStorageDirectory(),"123.png");
if(!file.exists())
{
Log.d(TAG,"file is not exist");
return;
}
OkHttpClient okHttpClient = new OkHttpClient();
RequestBody requestBody=RequestBody.create(MediaType.parse("application/octet-stream"),file);
Request.Builder builder = new Request.Builder();
Request request = builder.url("服务端地址").post(requestBody).build();
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.d(TAG, "onFailure " + "call = " + call.toString());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.d(TAG, "onResponse = " + response.body().toString());
}
});
}
}
具体的封装啊,代码结构的调整啊,就根据自己的项目需要去搞吧。