Asynctask не работает после получения слишком большого количества строк - PullRequest
0 голосов
/ 25 июня 2018

Я создаю приложение, в котором я синхронизирую свою онлайн-БД с автономной БД каждый раз, когда пользователь входит в систему. Таблица отбрасывается в автономном режиме, воссоздается, а затем добавляются новые строки (ее необходимо удалить и добавить новую, а не просто проверятьи добавление строк, которых уже нет в таблице).У меня было около 200 строк в моей онлайн-таблице, и они относительно быстро синхронизируются с моей автономной таблицей (в фоновом режиме я пробовал 3000, и он все еще обрабатывал. Но когда я сгенерировал 90 000 строк и попытался синхронизировать его с моей автономной БДон не будет перемещен.

Выполнен вход в onPreExecute (), но ни один из журналов в моем doInBackground. json не равен нулю. Для каждой извлеченной строки я добавляю строку в автономном режиме.

Кто-нибудь знает, в чем может быть проблема? Я пытался добавить LIMIT 200 в мои PHP-скрипты и до сих пор не сделал этого, что было странно, потому что когда у меня было 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: добавлен PHP Script, из которого извлекается массив JSONс:

<?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 голосов
/ 25 июня 2018

Ошибка указывает, что 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.Я хотел бы взглянуть на ваш необработанный ответ и посмотреть, не добавляет ли ограничение ограничение для ответа на объект с массивом результатов внутри него (чтобы он мог также включать аргументы, помогающие веб-вызовам обрабатывать пейджинг).В любом случае в формате ответа есть что-то, что токен не распознает как массив Json.

0 голосов
/ 26 июня 2018

Поняв, что PHP-скрипт перестал работать, потому что вместо * было извлечено слишком много строк и столбцов, я выбрал только те данные, которые мне действительно нужны (около 1/3 всех столбцов), затем я добавил предложение where, где ID будетвыше числа, которое я отправил с поста, и я продолжаю повторять сценарий, пока, наконец, ответ не станет «нулевым».

Спасибо за всех, кто внес свой вклад в поиск решения.

0 голосов
/ 25 июня 2018

Я догадываюсь, что данные нарушают цикл и приводят к завершению вашей программы без прохождения полного набора данных.Я просто добавил простую команду 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....
                }
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...