检索到太多行后,Asynctask不起作用

时间:2018-06-25 18:07:00

标签: java android mysqli android-asynctask

我正在做一个应用程序,每次用户登录时,我都会将我的在线数据库同步到脱机数据库。将该表脱机放置,重新创建,然后添加新行(必须删除它并添加新行,而不仅仅是检查并添加表中尚未存在的行)。我的在线表中大约有200行,并且它们以相对较快的速度同步到离线表中(在后台,然后我尝试了3000行,但仍在处理中。但是当我生成9万行并尝试将其同步到离线数据库中时它不会动。

已执行onPreExecute()中的日志,但doInBackground中没有任何日志。 json不为null。 对于每条检索到的行,我都离线添加一行。

有人知道这可能是什么问题吗? 我尝试在PHP脚本中添加LIMIT 200,但仍然没有这样做,这很奇怪,原因是当我执行200行时,但是当我将输出限制为200时却没有。 感谢您提供任何答案,这将使我更接近解决方案。

public class SyncVykresToOffline {

    String DataParseUrl = "/scriptsforandroidapplicationofflinemode/SyncVykresToOffline.php";
    JSONObject json = null;
    String str = "";
    HttpResponse response;
    DBHelper dbh;
    private Context mContext;
    public static boolean syncedvykres = false;
   int k = 200;

    public SyncVykresToOffline(Context context) {
        mContext = context;
        dbh = new DBHelper(mContext);
    }


    public class SyncVykres extends AsyncTask<Void, Void, Void>
    {
        public Context context;


        public SyncVykres(Context context)
        {
            this.context = context;
        }

        @Override
        protected void onPreExecute()
        {
            super.onPreExecute();
            Log.i("Poradie_zacal","ano");
        }

        @Override
        protected Void doInBackground(Void... arg0)
        {




            HttpClient myClient = new DefaultHttpClient();
            HttpPost myConnection = new HttpPost(DataParseUrl);


            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
            nameValuePairs.add(new BasicNameValuePair("limit", String.valueOf(k)));
            try {
                myConnection.setEntity(new UrlEncodedFormEntity(nameValuePairs));
            } catch (UnsupportedEncodingException e1) {
                e1.printStackTrace();
            }

            try {
                HttpResponse response = myClient.execute(myConnection);
            } catch (IOException e1) {
                e1.printStackTrace();
            }


            try {
                response = myClient.execute(myConnection);
                str = EntityUtils.toString(response.getEntity(), "UTF-8");

            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

            int i = 0;
            try{

               int vykres_version;

                JSONArray jArray = new JSONArray(str);
                json = jArray.getJSONObject(i);
                Log.i("Poradie_json",String.valueOf(jArray.length()));

                String
                        Nazov_vykresu;


                int Version,
                        ID_vykres,
                        ID_stav,
                        ID_zakazka,
                        Poradie;

                if(json == null) {
                    Log.i("Poradie","son is null");
                }


                while(json != null) {
                    Log.i("Poradie","been here");
                    ID_vykres = Integer.parseInt(json.getString("ID_vykres"));
                    vykres_version = dbh.getVykresVersion(ID_vykres);
                    Nazov_vykresu = json.getString("Nazov_vykresu");
                    ID_stav = Integer.parseInt(json.getString("ID_stav"));

                    ID_zakazka = Integer.parseInt(json.getString("ID_zakazka"));
                    Version = Integer.parseInt(json.getString("Version"));
                    Poradie = Integer.parseInt(json.getString("Poradie"));
                    Log.i("Poradie",json.getString("Poradie"));

                    dbh.SyncVykresToOffline(new technicky_vykres(ID_vykres,Nazov_vykresu,ID_stav,ID_zakazka,Version,Poradie));

                    i++;
                    json = jArray.getJSONObject(i);
                }



            } catch ( JSONException e) {
                e.printStackTrace();
            }

            catch (Exception e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return null;
        }
        protected void onPostExecute(Void result)
        {
            syncedvykres = true;
        }
    }
}

编辑:添加了Logcat日志。

06-25 20:36:07.013 8278-8308/com.example.chris.normitapplication W/System.err:     at org.json.JSON.typeMismatch(JSON.java:111)
        at org.json.JSONArray.<init>(JSONArray.java:96)
        at org.json.JSONArray.<init>(JSONArray.java:108)
        at com.example.chris.normitapplication.offline.SyncVykresToOffline$SyncVykres.doInBackground(SyncVykresToOffline.java:102)
        at com.example.chris.normitapplication.offline.SyncVykresToOffline$SyncVykres.doInBackground(SyncVykresToOffline.java:44)
        at android.os.AsyncTask$2.call(AsyncTask.java:292)
        at java.util.concurrent.FutureTask.run(FutureTask.java:237)

编辑2:添加了从以下位置检索JSON数组的PHP脚本:

<?php

include 'DatabaseConfig.php';

$conn = mysqli_connect($HostName,$HostUser,$HostPass,$DatabaseName);


if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}


mysqli_set_charset($conn,"utf8");


$vykres = array();



$sql = "SELECT * FROM `technicky_vykres`";

$result = mysqli_query($conn, $sql) or die("Error in Selecting " . mysqli_error($conn));



while($row =mysqli_fetch_assoc($result))
{
    $emparray[] = $row;
}


echo json_encode($emparray);

$conn->close();
?>

登录STR时发现问题:

<html>
    <head><title>502 Bad Gateway</title></head>
    <body bgcolor="white">
    <center><h1>502 Bad Gateway</h1></center>
    <hr><center>openresty</center>
    </body>
    </html>

3 个答案:

答案 0 :(得分:0)

我的直觉是,它的数据正在中断循环并导致您的程序在没有通过完整数据集的情况下结束。我只是添加了简单的try / catch(见下文)以打印出我们无法解析的任何数据对象,但仍继续处理下一行。当然,您需要对生产质量代码进行更好的错误处理。

     while(json != null) {
                try{
                Log.i("Poradie","been here");
                ID_vykres = Integer.parseInt(json.getString("ID_vykres"));
                vykres_version = dbh.getVykresVersion(ID_vykres);
                Nazov_vykresu = json.getString("Nazov_vykresu");
                ID_stav = Integer.parseInt(json.getString("ID_stav"));

                ID_zakazka = Integer.parseInt(json.getString("ID_zakazka"));
                Version = Integer.parseInt(json.getString("Version"));
                Poradie = Integer.parseInt(json.getString("Poradie"));
                Log.i("Poradie",json.getString("Poradie"));

                dbh.SyncVykresToOffline(new technicky_vykres(ID_vykres,Nazov_vykresu,ID_stav,ID_zakazka,Version,Poradie));

                i++;
                json = jArray.getJSONObject(i);
                }catch(Exception e){
                    //Something wrong with the data? log it and see if you can find the culprit row/data....
                    Log.i("The faulty jason obj: " + json);
                    continue; //Move on the next one....
                }
            }

答案 1 :(得分:0)

错误表明JSONArray认为您的回复未形成为Json数组。

JSONArray中的代码引发错误:

    public JSONArray(JSONTokener readFrom) throws JSONException {
    /*
     * Getting the parser to populate this could get tricky. Instead, just
     * parse to temporary JSONArray and then steal the data from that.
     */
    Object object = readFrom.nextValue();
    if (object instanceof JSONArray) {
        values = ((JSONArray) object).values;
    } else {
        throw JSON.typeMismatch(object, "JSONArray");
    }
}

因此令牌程序不会将对象识别为JSONArray。我将看一下您的原始响应,看看是否添加限制不会将响应更改为其中包含结果数组的对象(这样它也可以包含帮助Web调用处理分页的参数)。无论哪种方式,都有一些令牌无法识别为Json数组的响应格式。

答案 2 :(得分:0)

当意识到PHP脚本停止工作是因为检索了太多的行和列而不是*我仅选择了我真正需要的数据(约占所有列的1/3)之后,我添加了where子句,其中ID为高于我发来的邮件的数量,我一直重复该脚本,直到最终响应不是“ null”。

感谢所有为寻找解决方案做出贡献的人。