В чем проблема в этом коде при разборе JSON? - PullRequest
0 голосов
/ 30 марта 2019

Программа получает данные с веб-сервера и помещает данные в arrayList. Если размер arrayList больше 1, он успешно работает. Но если он меньше, должен отображаться экран ошибок, который я установил.

У меня вопрос, когда у него два разных tabItem и два разных массива, если размер одного из них не больше 1. На той же странице отображается сообщение об ошибке. А также показывать данные на странице. Как сделать так, чтобы этот экран отображался, когда на нем нет данных? There is data but show error page also. This is normal there is no data and show error page.

Это класс, который получает данные с веб-сервера.
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);
        }

Это функция brodcast для отправки массива и отправки ошибки.

// 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" />

1 Ответ

0 голосов
/ 01 апреля 2019

Я решил проблему.Проблема не возникает по моим кодам.Это происходит из-за веб-сервера.Программа получает «идущий» и «круглый» массив с веб-сервера.Сервер не отправляет «круглый» массив, так что это делает эту проблему в моей программе.Теперь они исправляют и отправляют пустой массив как «круглый».Итак, моя проблема решена.

...