从PHP服务器获取JSON数据

时间:2018-08-29 13:56:03

标签: android json android-asynctask

我正在尝试从我在wamp服务器中使用select.php查询的表中获取json数据,该数据在浏览器中显示,但是android由于某些原因无法下载该数据。

select.php

    <?php

$conn=mysqli_connect("localhost","root","", "shady") or die("Unable to connect");

if(mysqli_connect_error($conn)) {
    echo "Failed To Connect";
}

$qry = "SELECT * FROM `wellden`";

$res = mysqli_query($conn, $qry);

if ($res) {

    while ($row = mysqli_fetch_array($res)) {
        $flag[] = $row;
    }

    // returns tthe json data
echo json_encode($flag);


}


mysqli_close($conn);        


?>

工作正常并在浏览器中打印数据:

enter image description here

但是出于某些奇怪的原因,android似乎无法从php文件中获取回显的数据。

Android代码:

public class ListOfCourses extends AppCompatActivity {

ListView listView;
ArrayList<String> arrayList;
ArrayAdapter<String> arrayAdapter;
String REG_URL;



public class Listdata extends AsyncTask<String, Void, String>{


    HttpURLConnection conn;
    URL url;
    String jsonStringForMe;

    @Override
    protected String doInBackground(String... strings) {

        // MOST CRITICAL PART.....................................


        String s = strings[0];

        try {

            url = new URL(s);

            conn = (HttpURLConnection) url.openConnection();
            BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            StringBuilder sb = new StringBuilder();
            String line = null;

            // Read Server Response
            while ((line = reader.readLine()) != null) {
                // Append server response in string
                sb.append(line);
            }

            // Stroring it to use in the onPostExecute Cause we do not have any Button in this view
            jsonStringForMe = sb.toString();
            return  jsonStringForMe;





        }catch (Exception e){

            return e.getMessage();
        }


        // MOST CRITICA PART ENDS HERE..............................

    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        // JsonParsing Happens Here
        Toast.makeText(getApplicationContext(), jsonStringForMe+" ", Toast.LENGTH_LONG).show();

    }
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_list_of_courses);

    Listdata listdata = new Listdata();

    REG_URL="http://1.0.0.2/android_db_pool/select.php";
    listdata.execute(REG_URL);



}
}

,但是每次jsonStringForMe在postExecute中为我提供空值时,一切似乎都应该可以,但由于某些原因不起作用。 android端未接收到json数据的原因可能是什么?

编辑 我还添加了互联网许可:

AndroidManifest.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.slimshady.jamalsir1">

    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".ListOfCourses"></activity>
    </application>

</manifest>

编辑2

似乎ip地址可能是一个问题,但在insert.php中插入不起作用,我可以使用ip地址获取json数据,该ip地址是我服务器的ip地址 1.0。 0.2 。在android中,我仅在php中使用服务器的IP地址而不是localhost,因为php文件在我的服务器中,所以我使用 localhost

1 个答案:

答案 0 :(得分:1)

已经评论;

  

使用它存储在onPostExecute中,因为我们没有任何   此视图中的按钮

您没有在onPostExecute() 方法中添加或用来获取json ,但是您在Toast中添加了onPreExecute

尝试添加onPostExecute(),然后显示Toast

  

受保护的空白onPreExecute()

     

在之前的UI线程上运行 doInBackground(Params...)

https://developer.android.com/reference/android/os/AsyncTask#onPreExecute%28%29