【问题标题】:What is the problem in this code while JSON parsing?JSON解析时这段代码有什么问题?
【发布时间】:2019-03-30 10:00:40
【问题描述】:

程序从网络服务器获取数据并将数据放入arrayList。如果 arrayList 的大小大于 1 ,则它工作成功。但如果它更小,那肯定会显示我设置的错误屏幕。

我的问题是当它有两个不同的 tabItem 并获得两个不同的数组时,如果其中一个的大小不大于 1。它在同一页面中显示错误消息。并在页面中显示数据。当没有数据时如何显示此屏幕?

这是从网络服务器获取数据的类。
Voyage.java

JSONObject object = new JSONObject(response);
if (object.getString(MyConstants.SERVICE_STATUS).equals(MyConstants.SERVICE_RESPONSE_STATUS_NOTAVAILABLE)) {
    sendVoyagesErrorBroadcast(owner, MyConstants.ERROR_NOTAVAILABLE);
} else if (object.getString(MyConstants.SERVICE_STATUS).equals(MyConstants.SERVICE_RESPONSE_STATUS_SUCCESS)) {
    JSONArray result = object.getJSONArray(MyConstants.SERVICE_RESULT);
    if (result.length() > 0) {
        JSONArray resultGoing = result.getJSONObject(0).getJSONArray("going");
        sendVoyagesArrayBroadcast(owner + MyConstants.DIRECTION_GOING, resultGoing);
    } else {
        sendVoyagesErrorBroadcast(owner, MyConstants.ERROR_NO_VOYAGE);
    }
    if (has_return) {
        if (result.length() >1) {
            JSONArray resultReturn = result.getJSONObject(1).getJSONArray("round");
            sendVoyagesArrayBroadcast(owner + MyConstants.DIRECTION_RETURN, resultReturn);
        } else {
            sendVoyagesErrorBroadcast(owner, MyConstants.ERROR_NO_VOYAGE);
        }
    }
}

这是解析 JSON 数组并检查数组大小的类。 MyBaseVoyagementFragment.java

public ParseIntentDataAndLoadVoyagesAdapter(Intent intent) {
    this.intent = intent;
}

@Override       
protected String doInBackground(String... params) {
    if (isCancelled()) return "";
    try {
        JSONArray jsonArray = new JSONArray(intent.getStringExtra("data"));
        voyageList = new ArrayList<>();
        for (int i = 0; i < jsonArray.length(); i++) {
            voyageList.add(Voyage.setJsonToClass(jsonArray.getJSONObject(i), direction, owner));
        }

        if (voyageList.size() < 1) {
            setErrorView(MyConstants.ERROR_NO_VOYAGE);
        }

这些是发送数组和发送错误的广播函数。

// sonuç aldım diye sinyal gönderiyorum.
private void sendVoyagesArrayBroadcast(String target, JSONArray resultArray) {
    Intent intent = new Intent();
    intent.setAction(BROADCAST_TAG + target);
    intent.putExtra("data", resultArray.toString());
    /*if(!target.contains("bus2")){
        Log.e("sendSuccessBroadcast",target);
        intent.putExtra("data", resultArray.toString());
    }*/

    context.sendBroadcast(intent);
}

private void sendVoyagesErrorBroadcast(String target, int errorCode) {
    Intent intent = new Intent();
    intent.setAction(BROADCAST_TAG + target + "Error");
    intent.putExtra("data", errorCode);
    Log.e("sendErrorBroadcast", target);
    context.sendBroadcast(intent);
}

编辑:添加了 setErorView 功能。

   void setErrorView(int errorType) {
    if (errorType == MyConstants.ERROR_NOTAVAILABLE && owner == "ship") {
        if (SeawayReturnFragment.tabLayout != null)
            SeawayReturnFragment.tabLayout.setVisibility(View.INVISIBLE);

        SeawayDepartureFragment.tabLayout.setVisibility(View.INVISIBLE);
    }
    errorView.setVisibility(View.VISIBLE);
    mRecyclerView.setVisibility(View.GONE);
    TextView tvDesc = errorView.findViewById(R.id.tv_Desc);
    tvDesc.setText(getErrorDesc(errorType));
}

还有布局:

<?xml version="1.0" encoding="utf-8"?>
   <RelativeLayout 
   xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:paddingLeft="16dp"
   android:paddingRight="16dp"
   android:paddingTop="8dp">

   <TextView
    android:id="@+id/textView25"
    android:layout_width="wrap_content"
    android:layout_height="0dp"
    android:layout_below="@+id/img_Type"
    android:layout_centerHorizontal="true"
    android:gravity="center"
    android:text="Bir şeyler ters gitti"
    android:textColor="@color/md_grey_500"
    android:textSize="22sp"
    android:textStyle="bold" />
    <ImageView
    android:id="@+id/img_Type"
    android:layout_width="100dp"
    android:layout_height="100dp"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="80dp"
    android:contentDescription="@string/cd_Error"
    app:srcCompat="@drawable/ic_sadf" />

    <TextView
    android:id="@+id/tv_Desc"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/textView25"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"
    android:gravity="center"
 android:textAppearance="@style/Base.TextAppearance.AppCompat.Medium"
    android:textColor="@color/md_grey_400"
    android:textSize="20sp" />

【问题讨论】:

  • 你能分享你的xml布局文件吗?你在哪里设置错误屏幕?并分享setErrorView方法中的代码?
  • 对不起,我回复你晚了。我现在对它们进行了编辑。
  • 我猜它是某种背景图像,当数据长度大于 1 时会隐藏在数据后面
  • @MuhammadMuzammilSharif 我认为这与形象无关。我在 Voyage.java 中解析数据时使用的广播和 if 子句。
  • 您希望将广播中发送的错误显示到各自的片段中

标签: java android json android-volley android-broadcast


【解决方案1】:

我解决了问题。我的代码不会出现问题。这是由于网络服务器而发生的。该程序从 Web 服务器获取“going”和“round”数组。服务器不发送“圆形”数组,所以它在我的程序中产生了这个问题。现在他们修复并将空数组作为“圆形”发送。所以,我的问题解决了。

【讨论】:

    猜你喜欢
    • 2021-02-15
    • 2015-04-25
    • 2018-09-09
    相关资源
    最近更新 更多