一、前期学习参考B站视频
这里补充一下导入okhttp依赖:我仅仅弄那个implementation是没有用的,还是会报错,所以我就参考这篇文章添加链接描述下载了okhttp的依赖(没有下载OKIO,可以正常使用了)
二、无报错也无响应信息
private void getTong(){
Toast.makeText(this, "getTong!", Toast.LENGTH_LONG).show();
Log.d(TAG,"getTong");
OkHttpClient okHttpClient = new OkHttpClient();
MultipartBody multipartBody=new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("file",fileName, RequestBody.create(MediaType.parse("file/*"),file))
.addFormDataPart("seal",seal)
.addFormDataPart("phone",phone)
.build();
Request request = new Request.Builder().url("http://www.baidu.com").post(multipartBody).build();
//准备好请求时的call对象
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(@NonNull Call call, @NonNull IOException e) {
Log.d(TAG,"post onFailure");
}
@Override
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
Log.d(TAG,"onResponse");
Toast.makeText(this, response.body().string(), Toast.LENGTH_LONG).show();
Log.d(TAG,response.body().string());
// Toast.makeText(getApplicationContext(), "postsyncYi:" + response.body().string(), Toast.LENGTH_LONG).show();
}
});
}
困扰我很久,明明代码看起来写的没什么问题,也没有报错,但是就是接收不到任何的响应反馈,于是我反复查看了Logcat界面的输出,终于发现了存在的两个问题:
(一)No Network Security Config specified, using platform default
这句话虽然没有标红报错,但就是问题所在,我使用的url是http的,但是高版本的Android不支持http(说是9.0以后,但是我的Android7.0也出现了这个问题),解决办法:添加一个Network的xml文件,参考这个:okhttp添加http
(二)FATAL EXCEPTION: OkHttp Dispatcher
一串标红的java开头的东西不知道是什么但是出现这个问题的原因是:response.body().string()不能出现多次!!!!
(天呐,我真的被这个问题折磨了一下午才找到原因,痛苦面具
)因为这个response是接收的服务器的返回信息,而服务器只会返回一次,所以!我将这个结果用string 接收,后面再多次使用的话就用这个string 就不会报错了!,至此,终于成功输出了服务器的反馈信息(不容易啊),哦还有一点要注意:必须是.string(),不能是toString()
三、更新UI
无论是同步请求还是异步请求,http的请求都是在子线程中进行的,而ui的变动必须在主线程中,所以想根据http的结果来更新线程的话可以把结果传出来,或者使用runOnUiThread
, 如下方代码
private void getTong() {
Toast.makeText(this, "getTong!", Toast.LENGTH_LONG).show();
Log.d(TAG,"getTong");
OkHttpClient okHttpClient = new OkHttpClient();
MultipartBody multipartBody=new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("file",fileName, RequestBody.create(MediaType.parse("file/*"),file))
.addFormDataPart("seal",seal)
.addFormDataPart("phone",phone)
.build();
Request request = new Request.Builder().url("https://api.douban.com/v2/book/1220562").post(multipartBody).build();
//准备好请求时的call对象
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(@NonNull Call call, @NonNull IOException e) {
Log.d(TAG,"post onFailure");
}
@Override
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
Log.d(TAG,"onResponse");
String resu=response.body().string();
Log.d(TAG,resu);
//在这里面进行ui的修改
runOnUiThread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
//启动下一个Activity,并将服务器的结果传过去
Intent intent=new Intent(AccessHttp.this,suresult.class);
intent.putExtra("result",resu);
startActivity(intent);
}
});
// Toast.makeText(getApplicationContext(), "postsyncYi:" + response.body().string(), Toast.LENGTH_LONG).show();
}
});
}