【Android Studio】使用OkHttp遇到的问题分析 闪退等

常见问题

引言:
作为新手,往往照着写代码会出现很多的bug。有时候还真要看看Logcat里面的报错,然后百度一下,你就会发现,大家都遇到过。
我遇到的问题:
1.运行闪退:其实是没加权限,既然使用OkHttp肯定要获取网络权限,添加

<uses-permission android:name="android.permission.INTERNET"/>

2.在子线程中使用了同步请求,即子线程中执行call.excute()语句,但是没有回到UI线程就更新UI。
3.点击按钮,无法获取页面源代码。这个问题困扰了我几个小时,最后解决了。
解决方案如下:

  • 协议改用https
  • targetSdkVersion 降到27以下
  • 这第三种方法给个大赞,就是在 res 下新增一个 xml 目录,然后创建一个名为:network_security.xml。
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true" />
</network-security-config>

然后在AndroidManifest.xml文件下的application标签增加以下属性

<application
...
 android:networkSecurityConfig="@xml/network_security"
...
    />

下面我附上我成功的代码,是在碎片中实现的简单的GET,布局部分代码省略:

package com.example.test2;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import android.widget.TimePicker;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;

import java.io.BufferedWriter;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class Fragment3 extends Fragment implements View.OnClickListener {
    private Button send,clear;
    private TextView textView;
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view=inflater.inflate(R.layout.lay3,container,false);
        send=(Button)view.findViewById(R.id.send_request);
        clear=(Button)view.findViewById(R.id.clear_data);
        textView=(TextView)view.findViewById(R.id.receive_data);
        send.setOnClickListener(this);
        clear.setOnClickListener(this);
        return view;
    }

    private void sendRequest(){
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    OkHttpClient client = new OkHttpClient();
                    Request request = new Request.Builder()
                            .url("https://www.baidu.com")
                            .build();
                    Response response=client.newCall(request).execute();
                    String responseData=response.body().string();
                    showResponse(responseData);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        ).start();
    }

    private void showResponse(final String response){
        getActivity().runOnUiThread(new Runnable(){
            @Override
            public void run() {
                textView.setText(response);
            }
        });
    }
    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.send_request:
                sendRequest();
                break;
            case R.id.clear_data:
                Toast.makeText(getActivity(),"Text was cleared",Toast.LENGTH_SHORT).show();
                textView.setText("");
                break;
                default:
                    break;
        }
    }
}

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tran_sient

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值