Android Studio开发之路(四)okhttp访问服务器解决的报错们

一、前期学习参考B站视频

okhttp入门

post和get请求

这里补充一下导入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();

            }
        });


    }

猜你喜欢

转载自blog.csdn.net/qq_41104439/article/details/131011761