Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/224.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么当我的android应用程序在我的服务器上调用我的API时,我会得到一个空响应?_Android_Json_Android Spinner - Fatal编程技术网

为什么当我的android应用程序在我的服务器上调用我的API时,我会得到一个空响应?

为什么当我的android应用程序在我的服务器上调用我的API时,我会得到一个空响应?,android,json,android-spinner,Android,Json,Android Spinner,我有一个android应用程序,它调用信息并将其显示为列表 我有一个微调器,当您从微调器中选择日期时,您将获得与该日期相关的信息 在应用程序first load中,它会自动调用今天的信息 这是我在主要活动中使用的代码,用于创建微调器,用元素填充微调器,并处理对每个项目的单击: // Spinner element spinner = (Spinner) v.findViewById(R.id.spinner); // Spinner click listener spinner.setOnIt

我有一个android应用程序,它调用信息并将其显示为列表

我有一个微调器,当您从微调器中选择日期时,您将获得与该日期相关的信息

在应用程序first load中,它会自动调用今天的信息

这是我在主要活动中使用的代码,用于创建微调器,用元素填充微调器,并处理对每个项目的单击:

// Spinner element
spinner = (Spinner) v.findViewById(R.id.spinner);

// Spinner click listener
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
      public void onItemSelected(AdapterView<?> parent, View view,
                                       int position, long id) {
                // On selecting a spinner item
                //String item = parent.getItemAtPosition(position).toString();
                switch(position){
                    case 3:
                        if (JsonUtils.isNetworkAvailable(getActivity())) {
                            list.clear();
                            new MyTask().execute(Config.SERVER_URL + "/banko_api.php?d_o=-1");
                        } else {
                            Toast.makeText(getActivity(), getResources().getString(R.string.failed_connect_network), Toast.LENGTH_SHORT).show();
                        }
                        break;
                    case 4:
                        if (JsonUtils.isNetworkAvailable(getActivity())) {
                            list.clear();
                            new MyTask().execute(Config.SERVER_URL + "/banko_api.php?d_o=0");
                        } else {
                            Toast.makeText(getActivity(), getResources().getString(R.string.failed_connect_network), Toast.LENGTH_SHORT).show();
                        }
                        break;
                    case 5:
                        if (JsonUtils.isNetworkAvailable(getActivity())) {
                            list.clear();
                            new MyTask().execute(Config.SERVER_URL + "/banko_api.php?d_o=1");
                        } else {
                            Toast.makeText(getActivity(), getResources().getString(R.string.failed_connect_network), Toast.LENGTH_SHORT).show();
                        }
                        break;
                    default:
                        if (JsonUtils.isNetworkAvailable(getActivity())) {
                            list.clear();
                            new MyTask().execute(Config.SERVER_URL + "/banko_api.php?d_o=0");
                        } else {
                            Toast.makeText(getActivity(), getResources().getString(R.string.failed_connect_network), Toast.LENGTH_SHORT).show();
                        }
                        break;
                }
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {

            }
        });



        Calendar calendar = Calendar.getInstance();
        Date today = calendar.getTime();

        calendar.add(Calendar.DAY_OF_YEAR, -1);
        Date yesterday = calendar.getTime();

        calendar = Calendar.getInstance();

        calendar.add(Calendar.DAY_OF_YEAR, 1);
        Date tomorrow = calendar.getTime();


        DateFormat dateFormat = new SimpleDateFormat("dd/MM EEE");
        String todayAsString = dateFormat.format(today);
        String tomorrowAsString = dateFormat.format(tomorrow);
        String yesterdayAsString = dateFormat.format(yesterday);


        // Spinner Drop down elements
        List<String> categories = new ArrayList<String>();

        categories.add(yesterdayAsString);
        categories.add(todayAsString);
        categories.add(tomorrowAsString);

        // Creating adapter for spinner
        ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(getContext(), R.layout.spinner_item, categories);


        dataAdapter.setDropDownViewResource(R.layout.spinner_dropdown_item);
        // attaching data adapter to spinner

        spinner.setAdapter(dataAdapter);

        spinner.setSelection(4);
在这段代码的
try
部分,你可以看到我对结果做了一个日志,以查看来自服务器的内容,我刚刚得到这个:
D/resultTT:[]

正如您所看到的,try在else部分中,因此在本部分的if语句中,我检查结果是否为null或空;但是代码通过它并输入else语句,但仍然显示返回的结果数组为空

我需要一些帮助来找到这个空返回数组背后的原因,即使它在启动时加载良好。为什么在我选择微调器中的任何元素,然后返回到默认(今天)元素后,它不能获取信息

更新:这是我的php端服务器api代码

<?php

    include_once ('includes/variables.php');

    DEFINE ('DB_HOST', $host);
    DEFINE ('DB_USER', $user);   
    DEFINE ('DB_PASSWORD', $pass);
    DEFINE ('DB_NAME', $database);

    $mysqli = @mysql_connect (DB_HOST, DB_USER, DB_PASSWORD) OR die ('Could not connect to MySQL');
    @mysql_select_db (DB_NAME) OR die ('Could not select the database');

 ?>

<?php

    mysql_query("SET NAMES 'utf8'"); 
    $date_offset = mysql_real_escape_string($_GET[d_o]);
    //$date_offset = 0;
    if(empty($date_offset) || $date_offset == "0")
    {
        $date_offset_value = "0";
        $query="SELECT a.*, m.match_id, m.match_time, m.en_tournament_name FROM app_banko a inner join matches_of_comments m on m.match_id = a.match_id where a.date_offset = $date_offset_value limit 20";         
        $resouter = mysql_query($query);
    }
    else
    {
        $date_offset_value = $date_offset;  
        $query="SELECT a.*, m.match_id, m.match_time, m.en_tournament_name FROM app_banko a inner join matches_of_comments m on m.match_id = a.match_id where a.date_offset = $date_offset_value limit 20";         
        $resouter = mysql_query($query);
    }


    $set = array();

    $total_records = mysql_num_rows($resouter);
    if($total_records >= 1){

      while ($link = mysql_fetch_array($resouter, MYSQL_ASSOC)){

        $set['NewsApp'][] = $link;
      }
    }

     echo $val= str_replace('\\/', '/', json_encode($set)); 

?>


您的
结果
字符串是空的数组,但不是空的字符串。空数组表示为以下字符串:

String result = "[]";
在这种情况下,
result.length()
等于
2

解析JSON时,您需要知道解析的对象是
object
类型还是
Array
类型。前者用大括号括起来,后者用方括号括起来

因此,下面这句话:

JSONObject mainJson = new JSONObject(result);
应该是:

JSONArray mainJson = new JSONArray(result);
但我要强调的是,如果您想正确解析API,就需要知道它返回了什么

编辑:

那么,
json_encode
将很难猜测它是应该从使用
$set=Array()创建的空数组中创建
json数组
还是
json对象

像在循环中那样向数组中添加对象使
json\u encode
显然应该创建一个
json对象

我不知道您是否可以强制执行
json\u encode
的行为,但在最坏的情况下,您可以检查自己的数组是否为空,如果数组为空,则返回
null

$set = array();

$total_records = mysql_num_rows($resouter);
if ($total_records >= 1) {
  while ($link = mysql_fetch_array($resouter, MYSQL_ASSOC)) {
    $set['NewsApp'][] = $link;
  }
  echo $val= str_replace('\\/', '/', json_encode($set)); 
} else {
  echo $val="";
}

如果在期望对象时得到一个数组作为回报,那么对API的请求可能有问题。一种方法是在开发机器上设置Wireshark来嗅探和过滤流量。然后可以查看您的请求是否有错误。

来自
onPostExecute
方法的
response
参数的值可能包含strigifiedJSONArray,而不是JSONObject

您始终可以通过以下方式进行测试:

try:
    JSONArray jsonArray = new JSONArray(result);
catch(JSONException e) {
    // String `result` is not an array. Parse it as a regular JSONObject.
}
测试wheter字符串是否为空json数组(取决于它的格式,特别是当它可能包含一些白色字符时)检查它的长度可能是一个非常糟糕的主意

这完全取决于如何确定您正在调用的API端点

最后再给我一个提示。如果您计划使用REST API,我强烈建议您使用:

  • -允许您轻松定义访问API的接口
  • -自动转换Java模型的响应

  • 请在try block条件中放入一个检查结果。isEmpty()可能这可以解决您的问题。

    您无法直接获得字符串响应。它可以使用JSONObject和JSONArray。

    无法理解为什么要设置
    spinner.setSelection(4)
    还有你从服务器得到的响应,比如
    []
    ,它是一种字符串格式,所以当你调用
    if(null==result | | result.length()==0)
    时,它返回
    false
    ,然后转到else语句。我使用
    微调器.setselection(4)
    调用应用程序启动时的今天的信息。有趣的是,当我将微调器设置为4时,它会调用“今天”信息,但当我更改到另一个日期并返回到今天(再次单击微调器中的“今天”)时,我只会得到
    []
    即使我在应用程序启动时通过相同的调用得到结果,你有三个微调器项,对吗?为什么写案例3、4、5。您的微调器中还有其他项目吗?我有更多的项目,但我刚才提到了三个有问题的项目在您的DoinBackground上我用我的服务器端更新了我的问题,以便您可以检查我的报税表type@BaselShbeb更新的答案。如果我想在此编辑中检查数组是否为空,您的答案将非常有用,这将有助于我的应用程序用于确定数组是否为空的代码。但问题是数组不应该是空的,我不想检查它是否为空,因为我知道它不应该是空的,因为我在启动时调用它,它返回元素。所以我不想知道它是否为空,我想知道为什么它在启动时返回完整结果,在单击微调器中的today元素时返回空结果(换句话说,我想知道为什么它为空而不应该为空)。我用我的服务器端php脚本更新了我的问题。我不认为它有什么问题,因为我在某些情况下得到了响应(今天的信息在启动时被调用,但当我在微调器中单击“今天”项时,相同的调用返回空数组)
    try:
        JSONArray jsonArray = new JSONArray(result);
    catch(JSONException e) {
        // String `result` is not an array. Parse it as a regular JSONObject.
    }