【问题标题】:error connecting to server while fetching JSON data in Fragment在 Fragment 中获取 JSON 数据时连接到服务器时出错
【发布时间】:2018-10-04 11:10:54
【问题描述】:

我正在尝试使用片段中的以下代码从 php 文件中获取 JSON 数据,但每次运行代码时,系统总是返回在 result=false 时调用的 Toast,表明未获取数据。导致数据提取失败的问题可能是什么?

这是包含 JSON 数据的 inded.php 文件的代码。

<?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();

    }
}

任何帮助将不胜感激。先感谢您。

【问题讨论】:

  • 你能检查并告诉你得到的状态吗?
  • 如果你在上面调用 url 那么你解析它是错误的,因为它没有任何 JsonArray。
  • @UmangBurman 的状态为 200。我已按上述方式修改了我的代码
  • 当我在线测试时,您的 php 代码给了我false。 @比科
  • 谢谢@UmangBurman ...问题出在json数据中。我已经修改了php代码。数据格式不正确。干杯

标签: java android json android-fragments httpclient


【解决方案1】:

如果您正在调用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);

【讨论】:

    【解决方案2】:

    您的 JSON 需要重新设计。这是为您的android json解析代码生成正确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"
    }
    ]
    }
    

    【讨论】:

      【解决方案3】:

      在@UmangBurman 的大力帮助下,我得以彻底解决问题。问题是 JSON 数据。使用 JSON 数据格式和正确的 JSONAsynTask,我希望这个问题能帮助将来的人在他们的代码中形成基础。我已经更新了问题中的代码以显示调试版本。干杯

      【讨论】:

        【解决方案4】:

        在您的 doInBackground 方法的 Try Catch 块之后删除最后一条语句 return false 后尝试运行代码。 它总是返回假。 还要在 ELSE 块中添加 ** return false** .. 所以你的代码如下所示,再试一次

        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();
        
            }
        }
        

        【讨论】:

        • 没有。如果状态为 200,它将返回 true。查看他的代码
        • @ShreyaPrajapati Boolean 在返回类型的末尾肯定是必需的,因此您的代码将在 try/catch 之后要求返回类型。
        • @UmangBurman 我已经添加了,检查我更新的代码,还需要在 else 块中添加 return 语句。
        • @ShreyaPrajapati 我的意思是说在最后一个 catch() 之后需要返回 .. 你没有在最后添加,而是在 if 条件下添加。
        • 我已经尝试过这段代码 sn-p 但错误仍然存​​在。 HTTP状态码是200所以我真的不明白这个问题
        猜你喜欢
        • 2014-05-19
        • 2013-11-08
        • 2014-03-25
        • 1970-01-01
        • 2017-12-16
        • 1970-01-01
        • 1970-01-01
        • 2020-06-02
        • 2018-09-22
        相关资源
        最近更新 更多