本文利用okhttp,需要自行添加。
访问网站:https://github.com/square/okhttp
在app/build.gradle中dependencies添加如下内容(注意,这是目前最新版本,版本更新则根据该网站提供)
implementation("com.squareup.okhttp3:okhttp:4.5.0")
如果你的android studio 版本低于3.0,应该使用
compile("com.squareup.okhttp3:okhttp:4.5.0")
准备工作完成,下面开始介绍。
首先,新建一个java类,该类只定义一个方法,用于接收路由和json字符串,并产生一个回调方法供后续处理。需要注意的是在enqueue()方法内部已经开启子线程了。
public class HttpUtil {
public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
public static void sendOkHttpRequest(final String address,final String json, final okhttp3.Callback callback) {
OkHttpClient client = new OkHttpClient();
RequestBody requestBody = RequestBody.create(json, JSON);
Request request = new Request.Builder()
.url(address)
.post(requestBody)
.build();
client.newCall(request).enqueue(callback);
}
}
接下来,讲解如何调用。该例子以提交用户名和密码为例,实际情况可以自己改,假设有个控件mBtnpost,对其监听。如果需要提交较为复杂数据,可以进行嵌套,本文不讲。
mBtnpost.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
sendRequestOkHttp();
} catch (JSONException e) {
e.printStackTrace();
}
}
});
private void sendRequestOkHttp() throws JSONException {
//构建json数据
JSONObject json = new JSONObject();
json.put("usename","admin");
json.put("password","123456");
//实际路由
String url ="http://xxx";
//实例化
HttpUtil httpUtil = new HttpUtil();
httpUtil.sendOkHttpRequest(url, json.toString(), new okhttp3.Callback() {
@Override
public void onFailure(Call call, IOException e) {
httpError(); //对异常情况处理
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String responsedata = response.body().string();
parsejson(responsedata); //解析从服务器返回json数据
}
});
}
接下来实现如何解析服务器返回json数据。因为在子线程中是不可以进行UI操作的,所以要用runOnUiThread方法回到主线程。我们这里假设服务器返回{“ret”:“0”},并把0进行显示。当然这里用最简单的方式,如果需要解析较为复杂的,可以参考其它博文。
private void parsejson( final String jsonData){
runOnUiThread(new Runnable() {
@Override
public void run() {
try {
JSONObject jsonObject = new JSONObject(jsonData);
String ret = jsonObject.optString("ret");
text.setText(ret);//假设屏幕有个text控件,显示出来
} catch (JSONException e) {
e.printStackTrace();
}
}
});
}
若出现异常,可以在这里进行相关处理,默认你要进行UI操作,用了 runOnUiThread()f方法,不需要则自行修改。
private void httpError(){
runOnUiThread(new Runnable() {
@Override
public void run() {
}
});
}
本文仅针对json数据进行传输,提供一个简单思路,而且解析内容较为简单。若是要传递文件等复杂内容,请参考其它博文。