ошибка подключения к серверу при получении данных JSON во фрагменте - PullRequest
0 голосов
/ 04 октября 2018

Я пытаюсь получить данные JSON из php-файла с приведенным ниже кодом в моем фрагменте, но каждый раз, когда я запускаю код, система всегда возвращает Toast, вызванный, когда result=false указывает, что данные не были выбраны.В чем может быть проблема, вызывающая сбой выборки данных?

Вот код для файла inded.php, содержащего данные JSON.

<?php
$arr = array ( "properties"    =>   array(
            array(
                "companyName"   =>  "Motorola",
                "name" => "Moto"
            ),
            array(
                "companyName" => "Sony",
                "name" => "xPeria"
            ),
            array(
                "companyName" => "Infinix",
                "name" => "S2 Pro"
            )
        )
);

echo json_encode($arr);
?>

Ниже приведен код в onCreateView()фрагмент фрагмента.

    new JSONAsynTask().execute("http://buvick-group.com/app/index.php");

Ниже приведен код для моего JSONAsynTask() класса.

class JSONAsynTask extends AsyncTask<String, Void, Boolean> {
    String result;
    ProgressDialog dialog;


    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        dialog = new ProgressDialog(getActivity());
        dialog.setMessage("Loading, please wait");
        dialog.setTitle("Connecting server");
        dialog.show();
        dialog.setCancelable(false);
    }

    @Override
    protected Boolean doInBackground(String... urls) {


        try {


            HttpGet httppost = new HttpGet(urls[0]);
            HttpClient httpclient = new DefaultHttpClient();
            HttpResponse response = httpclient.execute(httppost);


            int status = response.getStatusLine().getStatusCode();
            Log.e(TAG, "HTTP Internet Result: " + String.valueOf(status));
            if (status == 200) {
                HttpEntity entity = response.getEntity();
                String data = EntityUtils.toString(entity);

                JSONObject jsono = new JSONObject(data);
                JSONArray jarray = jsono.getJSONArray("properties");

                Log.e(TAG, "JSON Result Length: " + String.valueOf(jarray.length()));

                for (int i = 0; i < jarray.length(); i++) {
                    JSONObject object = jarray.getJSONObject(i);

                    Property property = new Property();

                    property.setName(object.getString("companyName"));
                    property.setDescription(object.getString("name"));

                    propertiesList.add(property);
                }
                return true;
            }
        } catch (ParseException e1) {
            e1.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return false;
    }

    protected void onPostExecute(Boolean result) {

        dialog.dismiss();
        adapter.notifyDataSetChanged();
        if(result == false)
            Toast.makeText(getActivity(), "Unable to fetch data from server", Toast.LENGTH_LONG).show();

    }
}

Любая помощь будет принята с благодарностью.Заранее спасибо.

Ответы [ 4 ]

0 голосов
/ 04 октября 2018

С большой помощью @UmangBurman я смог разобраться в своей проблеме.Проблема заключалась в данных JSON.Надеюсь, что с форматом данных JSON и правильным JSONAsynTask этот вопрос поможет кому-то в будущем сформировать базу в своем коде.Я обновил код в вопросе, чтобы представить отлаженную версию.Приветствия

0 голосов
/ 04 октября 2018

Если вы вызываете https://androidtutorialpoint.com/api/MobileJSONObject.json API, то напрямую анализируйте JsonObject.

JSONObject object = new JSONObject(data);
Property property = new Property();
property.setName(object.getString("companyName"));
property.setDescription(object.getString("name"));

propertiesList.add(property);
0 голосов
/ 04 октября 2018

Ваш JSON должен быть переработан.Вот код, чтобы сгенерировать правильный JSON для вашего кода разбора Android JSON

<?php
$response = array();
$response["code"] = 200;
$response["properties"] = array();

for($i = 0; $i < 6; $i++) {
    $item = array();
    $item["companyName"] = "Company ".$i;
    $item["name"] = "Model ".$i;
    array_push($response["properties"],  $item );

}


echo json_encode($response);

?>

Это будет печатать

{
"code":200,
"properties":[
{
"companyName":"Company 0",
"name":"Model 0"
},
{
"companyName":"Company 1",
"name":"Model 1"
},
{
"companyName":"Company 2",
"name":"Model 2"
},
{
"companyName":"Company 3",
"name":"Model 3"
},
{
"companyName":"Company 4",
"name":"Model 4"
},
{
"companyName":"Company 5",
"name":"Model 5"
}
]
}
0 голосов
/ 04 октября 2018

Попробуйте запустить код после удаления последнего оператора вернуть false после блока Try Catch вашего doInBackground метода.Это всегда возвращает ложь.Также добавьте ** return false ** в блок ELSE. Итак, ваш код выглядит как показано ниже, попробуйте еще раз

class JSONAsynTask extends AsyncTask<String, Void, Boolean> {
    String result;
    ProgressDialog dialog;


    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        dialog = new ProgressDialog(getActivity());
        dialog.setMessage("Loading, please wait");
        dialog.setTitle("Connecting server");
        dialog.show();
        dialog.setCancelable(false);
    }

    @Override
    protected Boolean doInBackground(String... urls) {


        try {


            HttpGet httppost = new HttpGet(urls[0]);
            HttpClient httpclient = new DefaultHttpClient();
            HttpResponse response = httpclient.execute(httppost);


            int status = response.getStatusLine().getStatusCode();
            if (status == 200) {
                HttpEntity entity = response.getEntity();
                String data = EntityUtils.toString(entity);


                JSONObject jsono = new JSONObject(data);
                JSONArray jarray = jsono.getJSONArray("properties");

                for (int i = 0; i < jarray.length(); i++) {
                    JSONObject object = jarray.getJSONObject(i);

                    Property property = new Property();

                    property.setName(object.getString("companyName"));
                    property.setDescription(object.getString("name"));

                    propertiesList.add(property);
                }
                return true;
            }else{

                return false;
             }



        } catch (ParseException e1) {
            e1.printStackTrace();
            return false;
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        } catch (JSONException e) {
            e.printStackTrace();
            return false;
        }

    }

    protected void onPostExecute(Boolean result) {

        dialog.dismiss();
        adapter.notifyDataSetChanged();
        if(result == false)
            Toast.makeText(getActivity(), "Unable to fetch data from server", Toast.LENGTH_LONG).show();

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...