首页 > 解决方案 > 从远程数据库获取异常下载 JSON

问题描述

我正在使用以下代码从远程 MySQL 数据库获取数据:

private void getComprasFromDB(int id) {
    Log.d("HOLA ADDRESSES", "DIRECCION LEIDA SIN BUSCAR: ");

    compras.clear();


    AsyncTask<Integer, Void, Void> asyncTask = new AsyncTask<Integer, Void, Void>() {
        @Override
        protected Void doInBackground(Integer... addressesIds) {

            Log.d("HOLA ADDRESSES", "DIRECCION LEIDA SIN BUSCAR: "+id_usuario);


            OkHttpClient client = new OkHttpClient();
            okhttp3.Request request = new okhttp3.Request.Builder()
                    .url("https://.../mis_compras.php?id="+id_usuario)
                    .build();
            try {
                okhttp3.Response response = client.newCall(request).execute();

                JSONArray array = new JSONArray(response.body().string());

                for (int i = 0; i < array.length(); i++) {

                    JSONObject object = array.getJSONObject(i);

                     Log.d("HOLA PERFIL", "mis compras response: " + response.body().string());


                   Compras compra = new Compras(
                            object.getString("id_ventas"),
                            object.getString("id_ventas"),
                            object.getString("id_ventas"),
                            object.getString("id_ventas"),
                            object.getString("id_ventas"),
                            object.getString("id_ventas"),
                            object.getString("id_ventas"),
                            object.getString("id_ventas"),
                            object.getString("id_ventas"),
                            object.getString("id_ventas"),
                            object.getString("id_ventas"),
                            object.getString("id_ventas")
                    );

                    compras.add(compra);
                }


            } catch (IOException e) {
                Log.d("HOLA ADDRESSES", "DIRECCION LEIDA SIN BUSCAR:IO "+e);
                e.printStackTrace();
            } catch (JSONException e) {
                Log.d("HOLA ADDRESSES", "DIRECCION LEIDA SIN BUSCAR:json "+e);
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {


            adapter.notifyDataSetChanged();
            if (compras.size() == 0){
                txtNohaytickets.setVisibility(View.VISIBLE);
            }
            else
            {
                txtNohaytickets.setVisibility(View.GONE);
            }

        }
    };

    asyncTask.execute(id);
}

它工作正常。我的问题是当我用另一个更改数据库表时。在 PHP 文件中,工作表 tb_tickets_reparacion 的代码如下:

$con->set_charset("utf8");

if (mysqli_connect_errno()) {
    echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
/*Get the id of the last visible item in the RecyclerView from the request and store it in a variable. For the first request id will be zero.*/ 

$id = mysqli_real_escape_string($con,$_GET["id"]);

$sql= "Select tr.*,tc.nombre as nombre_categoria,tm.nombre as nombre_marca,
                modelos.nombre as nombre_modelo 
        from tb_tickets_reparacion tr 
            LEFT JOIN tb_categorias tc ON tc.id = tr.categoria  
            LEFT JOIN tb_marcas tm ON tm.id = tr.marca   
            LEFT JOIN tb_modelos modelos ON modelos.id = tr.modelo
        WHERE id_cliente = '".$id."' ";

$result = mysqli_query($con ,$sql);

while ($row = mysqli_fetch_assoc($result)) {
    $array[] = $row;
}
header('Content-Type:Application/json');
echo json_encode($array);
mysqli_free_result($result);
mysqli_close($con);

如果我使用相同的应用程序代码但更改 PHP 文件以从另一个表中获取数据,仅用于测试,如下所示:

$sql= "Select tr.* from tb_ventas tr ";

然后我得到以下异常:

2019-10-09 12:12:13.448 27800-27875/? E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #2
    Process: com.mpidesarrollo.jogua, PID: 27800
    java.lang.RuntimeException: An error occurred while executing doInBackground()
        at android.os.AsyncTask$3.done(AsyncTask.java:353)
        at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383)
        at java.util.concurrent.FutureTask.setException(FutureTask.java:252)
        at java.util.concurrent.FutureTask.run(FutureTask.java:271)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
        at java.lang.Thread.run(Thread.java:764)
     Caused by: java.lang.IllegalStateException: closed
        at okio.RealBufferedSource.rangeEquals(RealBufferedSource.java:408)
        at okio.RealBufferedSource.rangeEquals(RealBufferedSource.java:402)
        at okhttp3.internal.Util.bomAwareCharset(Util.java:432)
        at okhttp3.ResponseBody.string(ResponseBody.java:174)
        at com.mpidesarrollo.jogua.activity.MisComprasFragment$4.doInBackground(MisComprasFragment.java:271)
        at com.mpidesarrollo.jogua.activity.MisComprasFragment$4.doInBackground(MisComprasFragment.java:251)
        at android.os.AsyncTask$2.call(AsyncTask.java:333)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245) 
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162) 
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636) 
        at java.lang.Thread.run(Thread.java:764) 

我究竟做错了什么?

编辑

查询的浏览器输出:

在此处输入图像描述

给定查询的 PHPMyAdmind 输出:

在此处输入图像描述

标签: phpandroidokhttp

解决方案


推荐阅读