[我正在尝试使用OkHttp3来获取数据,但是我在logcat窗口中遇到了异常。尽管我在logcat中获取了数据,但是在回收者视图中显示。
2020-03-13 12:17:24.123 19447-19447/com.app.aamkuapp E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.app.aamkuapp, PID: 19447
android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1513)
at java.net.SocketInputStream.read(SocketInputStream.java:175)
at java.net.SocketInputStream.read(SocketInputStream.java:144)
at okio.InputStreamSource.read(Okio.kt:102)
at okio.AsyncTimeout$source$1.read(AsyncTimeout.kt:159)
at okio.RealBufferedSource.read(RealBufferedSource.kt:41)
at okhttp3.internal.http1.Http1ExchangeCodec$AbstractSource.read(Http1ExchangeCodec.kt:352)
at okhttp3.internal.http1.Http1ExchangeCodec$ChunkedSource.read(Http1ExchangeCodec.kt:433)
at okhttp3.internal.connection.Exchange$ResponseBodySource.read(Exchange.kt:279)
at okio.Buffer.writeAll(Buffer.kt:1104)
at okio.RealBufferedSource.readString(RealBufferedSource.kt:194)
at okhttp3.ResponseBody.string(ResponseBody.kt:187)
at com.app.aamkuapp.HomeFragment$1$1.run(HomeFragment.java:122)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7156)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:975)
Suppressed: android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1513)
at java.net.SocketInputStream.read(SocketInputStream.java:175)
at java.net.SocketInputStream.read(SocketInputStream.java:144)
at okio.InputStreamSource.read(Okio.kt:102)
at okio.AsyncTimeout$source$1.read(AsyncTimeout.kt:159)
at okio.RealBufferedSource.read(RealBufferedSource.kt:41)
at okhttp3.internal.http1.Http1ExchangeCodec$AbstractSource.read(Http1ExchangeCodec.kt:352)
at okhttp3.internal.http1.Http1ExchangeCodec$ChunkedSource.read(Http1ExchangeCodec.kt:433)
at okhttp3.internal.Util.skipAll(Util.kt:337)
at okhttp3.internal.Util.discard(Util.kt:358)
at okhttp3.internal.http1.Http1ExchangeCodec$ChunkedSource.close(Http1ExchangeCodec.kt:471)
at okio.ForwardingSource.close(ForwardingSource.kt:34)
at okhttp3.internal.connection.Exchange$ResponseBodySource.close(Exchange.kt:306)
at okio.RealBufferedSource.close(RealBufferedSource.kt:461)
at kotlin.io.CloseableKt.closeFinally(Closeable.kt:56)
at okhttp3.ResponseBody.string(ResponseBody.kt:186)
... 8 more
这是下面显示错误的java代码中的行:
String resp = response.body().string();
下面是我的代码:
private void loadGen(){
final ProgressDialog prg = new ProgressDialog(getActivity());
prg.setMessage("Getting data...");
prg.setCancelable(false);
prg.show();
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(20, TimeUnit.SECONDS)
.readTimeout(20,TimeUnit.SECONDS)
.writeTimeout(20,TimeUnit.SECONDS)
.build();
Request request = new Request.Builder().url(URL).build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onResponse(@NotNull Call call, @NotNull final Response response) throws IOException {
if(getActivity() != null) {
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
try {
String resp = response.body().string();
if (resp.length() > 0) {
JSONObject jsonObject = new JSONObject(resp);
JSONArray jsonArray = jsonObject.getJSONArray("product_data");
for (int i = 0; i < 4; i++) {
JSONObject jObj = jsonArray.getJSONObject(i);
String str1 = jObj.getString("product_photo");
String str2 = jObj.getString("product_price");
// Log.d("img",str1 + str2);
Log.d("pr", str2);
HomeGeneralModel model = new HomeGeneralModel(str1, str2);
generalList.add(model);
}
genAdapter = new HomeGeneralAdapter(getActivity(), generalList);
homeGen.setAdapter(genAdapter);
}
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
}
});
}
}
@Override
public void onFailure(@NotNull Call call, @NotNull final IOException e) {
if(getActivity() != null){
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
prg.dismiss();
Toast.makeText(getActivity(),e.getMessage(),Toast.LENGTH_SHORT).show();
}
});
}
}
});
}
来自服务器的JSON响应如下所示:
{
"image_path": "http://aamku.com/admin/upload/product_images/general/",
"msg": "General categoery product details",
"status": 1,
"product_data": [
{
"product_name": "Pi-Pi jod kar ye Notebook li hai",
"product_price": "249.00",
"category_id": "9",
"product_id": "125",
"product_photo": "1574935198_1.jpg"
},
{
"product_name": "Tere Jesa year kaha kaha esa yarana",
"product_price": "249.00",
"category_id": "9",
"product_id": "128",
"product_photo": "1574935455_1.jpg"
}
]
}
有人请让我知道我在做什么错。任何帮助都将不胜感激。
谢谢
尝试一下:
将此代码添加到onCreate();
int SDK_INT = android.os.Build.VERSION.SDK_INT;
if (SDK_INT > 8)
{
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
.permitAll().build();
StrictMode.setThreadPolicy(policy);
//your codes here
}
快乐编码:D
当应用程序尝试在其主线程上执行联网操作时,抛出此异常。
要解决此问题,请在AsyncTask中运行您的代码。
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
protected Long doInBackground(URL... urls) {
int count = urls.length;
long totalSize = 0;
for (int i = 0; i < count; i++) {
totalSize += Downloader.downloadFile(urls[i]);
publishProgress((int) ((i / (float) count) * 100));
// Escape early if cancel() is called
if (isCancelled()) break;
}
return totalSize;
}
protected void onProgressUpdate(Integer... progress) {
setProgressPercent(progress[0]);
}
protected void onPostExecute(Long result) {
showDialog("Downloaded " + result + " bytes");
}
}
创建后,任务执行非常简单:
new DownloadFilesTask().execute(url1, url2, url3);
不要忘记为AndroidManifest.xml
文件添加权限:
<uses-permission android:name="android.permission.INTERNET"/>
尝试一下
public void onViewCreated(View view, Bundle savedInstanceState)
{
int SDK_INT = android.os.Build.VERSION.SDK_INT;
if (SDK_INT > 8)
{
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
.permitAll().build();
StrictMode.setThreadPolicy(policy);
//your codes here
}
}