常见问题
引言:
作为新手,往往照着写代码会出现很多的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;
}
}
}