开发者社区> 问答> 正文

如何使用OkHttp3获取JSONArray形式的JSONObject

我正在尝试使用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"
     }
    ]
   }

有人请让我知道我在做什么错,任何帮助都将不胜感激。

问题来源:Stack Overflow

展开
收起
montos 2020-03-27 16:19:52 823 0
1 条回答
写回答
取消 提交回答
  • 尝试这个:

    将此代码添加到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 code here...
    }
    

    回答来源:Stack Overflow

    2020-03-27 16:20:12
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载