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

常见问题

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

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

2.无法调用runOnUiThread方法:碎片中调用这个方法要注意,要这样使用

    private void showResponse(final String response){
        getActivity().runOnUiThread(new Runnable(){
            @Override
            public void run() {
                textView.setText(response);
            }
        });
    }

即先获取当前活动。
3.点击按钮,无法获取页面源代码。这个问题困扰了我几个小时,最后解决了。
解决方案如下:

  • APP改用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;
        }
    }
}

发布了43 篇原创文章 · 获赞 56 · 访问量 5122

猜你喜欢

转载自blog.csdn.net/tran_sient/article/details/102093273
今日推荐