Хранение более 1000 данных на SQLite - PullRequest
0 голосов
/ 04 октября 2019

Мне нужно вставить большие данные на нашем SQLiteDatabase из ответа нашего сервера. Но до сих пор я все еще путаюсь с AsyncTask() и хочу получить разъяснения по этому поводу. Вот мой полный код использования AsyncTask(). Я использую библиотеку AndroidNetworking для HTTP-запроса

class ProgressAsync extends AsyncTask<String, String, Boolean> {

    boolean result = false;
    ProgressDialog progressDialog;

    @Override
    protected void onPreExecute() {
        new Handler(Looper.getMainLooper()).post(new Runnable() {
            @Override
            public void run() {
                loadingDialog = new LoadingDialog();
                //dialogLoading.setTargetFragment(this, 1);
                FragmentManager fragmentManager = getSupportFragmentManager();
                loadingDialog.show(fragmentManager, "Dialog_Loading");
            }
        });

        super.onPreExecute();
    }

    @Override
    protected Boolean doInBackground(String... params) {

        try 
            JSONObject JSONparams = new JSONObject();
            try {
                JSONparams.put("a", "1");
                JSONparams.put("b", "1");
                JSONparams.put("c", "1");
                JSONparams.put("d", "1");

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


            OkHttpClient okHttpClient = new OkHttpClient().newBuilder().connectTimeout(15, TimeUnit.SECONDS).readTimeout(15, TimeUnit.SECONDS).writeTimeout(15, TimeUnit.SECONDS).build();

            AndroidNetworking.initialize(getApplicationContext(), okHttpClient);

            AndroidNetworking.get(url)
                    .setPriority(Priority.HIGH).build()
                    .getAsJSONArray(new JSONArrayRequestListener() {
                        @Override
                        public void onResponse(JSONArray response) {
                            Log.e("Response", String.valueOf(response));

                            try {

                                for (int i = 0; i < response.length(); i++) {
                                    JSONObject objUsers = response.getJSONObject(i);

                                    final String user_id = objUsers.getString("id");
                                    final String issued_company_id = objUsers.getString("subcompany_id");
                                    final String position = objUsers.getString("route_id");
                                    final String card_id = objUsers.getString("route_name");


                                            KMpost kmpost = new KMpost();
                                            kmpost.setId(user_id);
                                            kmpost.setSubcompany_id(issued_company_id);
                                            kmpost.setRoute_id(position);
                                            kmpost.setRoute_name(card_id);

                                            MainActivity.appDatabase.dao2().insertAllkm(kmpost);

                                }

                                if (MainActivity.appDatabase.isOpen()){
                                    MainActivity.appDatabase.close();
                                }

                                result = true;

                                Log.e("Status", String.valueOf(a));


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

                        }

                        @Override
                        public void onError(ANError anError) {
                            Log.e("anError", String.valueOf(anError.getErrorCode()));
                            a = false;
                        }
                    });

        } catch (Throwable throwable) {
            throwable.printStackTrace();

        }

        return false;
    }

    @Override
    protected void onPostExecute(Boolean aBoolean) {
        super.onPostExecute(aBoolean);

        Log.e("Logsssssssssss", "LOgssssssssss");

        Thread thread = new Thread() {
            @Override
            public void run() {
             try {
                 while (!result) {
                  //Thread.sleep(1000);
                  }
                 loadingDialog.dismiss();

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

        thread.start();
    }
}

Вопрос 1: Почему в журнале onPostExecute() сначала показывается, а doInBackground() еще не закончено? И как я могу это исправить?

Вопрос 2: действительно ли помогает цикл while()? Или это просто решение для помощи при помощи бинтов? *

Вопрос 3. Как избежать задержки / зависания при загрузке анимации ProgressDialog?

Ответы [ 2 ]

0 голосов
/ 09 октября 2019

Решаю. Я думаю, что вставка данных в SQLiteDatabase является причиной задержки интерфейса. И поскольку AndroidNetworking использует отдельный Thread, и выполнение onPostExecute() выполняется первым, не дожидаясь runInBackground(), поэтому я нашел решение, разделяющее вставку данных в новый Thread(). и это работает :).

Полный код:

class ProgressAsync extends AsyncTask<String, String, Boolean> {

    boolean result = false;
    ProgressDialog progressDialog;

    @Override
    protected void onPreExecute() {
        new Handler(Looper.getMainLooper()).post(new Runnable() {
            @Override
            public void run() {
                loadingDialog = new LoadingDialog();
                //dialogLoading.setTargetFragment(this, 1);
                FragmentManager fragmentManager = getSupportFragmentManager();
                loadingDialog.show(fragmentManager, "Dialog_Loading");
            }
        });

        super.onPreExecute();
    }

    @Override
    protected Boolean doInBackground(String... params) {

        try
        JSONObject JSONparams = new JSONObject();
        try {
            JSONparams.put("a", "1");
            JSONparams.put("b", "1");
            JSONparams.put("c", "1");
            JSONparams.put("d", "1");

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


        OkHttpClient okHttpClient = new OkHttpClient().newBuilder().connectTimeout(15, TimeUnit.SECONDS).readTimeout(15, TimeUnit.SECONDS).writeTimeout(15, TimeUnit.SECONDS).build();

        AndroidNetworking.initialize(getApplicationContext(), okHttpClient);

        AndroidNetworking.get(url)
                .setPriority(Priority.HIGH).build()
                .getAsJSONArray(new JSONArrayRequestListener() {
                    @Override
                    public void onResponse(JSONArray response) {
                        Log.e("Response", String.valueOf(response));

                        try {

                            new Thread(new Runnable() {
                                @Override
                                public void run() {
                                    for (int i = 0; i < response.length(); i++) {
                                        JSONObject objUsers = response.getJSONObject(i);

                                        final String user_id = objUsers.getString("id");
                                        final String issued_company_id = objUsers.getString("subcompany_id");
                                        final String position = objUsers.getString("route_id");
                                        final String card_id = objUsers.getString("route_name");


                                        KMpost kmpost = new KMpost();
                                        kmpost.setId(user_id);
                                        kmpost.setSubcompany_id(issued_company_id);
                                        kmpost.setRoute_id(position);
                                        kmpost.setRoute_name(card_id);

                                        MainActivity.appDatabase.dao2().insertAllkm(kmpost);
                                    }

                                    if (MainActivity.appDatabase.isOpen()){
                                        MainActivity.appDatabase.close();
                                    }

                                    //adding the code for dismiss dialog
                                    loadingDialog.dismiss();

                                }
                            }).start();

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

                    }

                    @Override
                    public void onError(ANError anError) {
                        Log.e("anError", String.valueOf(anError.getErrorCode()));
                    }
                });

    } catch (Throwable throwable) {
        throwable.printStackTrace();

    }

    return false;
}

@Override
protected void onPostExecute(Boolean aBoolean) {
    super.onPostExecute(aBoolean);
}
0 голосов
/ 04 октября 2019

как насчет изменения кода следующим образом

//showDialog
            AndroidNetworking.get(url)
                    .setPriority(Priority.HIGH).build()
                    .getAsJSONArray(new JSONArrayRequestListener() {
                        @Override
                        public void onResponse(JSONArray response) {
                            Log.e("Response", String.valueOf(response));

                            try {

                                for (int i = 0; i < response.length(); i++) {
                                    JSONObject objUsers = response.getJSONObject(i);

                                    final String user_id = objUsers.getString("id");
                                    final String issued_company_id = objUsers.getString("subcompany_id");
                                    final String position = objUsers.getString("route_id");
                                    final String card_id = objUsers.getString("route_name");


                                            KMpost kmpost = new KMpost();
                                            kmpost.setId(user_id);
                                            kmpost.setSubcompany_id(issued_company_id);
                                            kmpost.setRoute_id(position);
                                            kmpost.setRoute_name(card_id);



    //MainActivity.appDatabase.dao2().insertAllkm(kmpost);
//Fire AsyncTask to Save to dao() and onPostThat Task hide the progressBar

                                }

                                if (MainActivity.appDatabase.isOpen()){
                                    MainActivity.appDatabase.close();
                                }

                                result = true;

                                Log.e("Status", String.valueOf(a));


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

                        }

                        @Override
                        public void onError(ANError anError) {
                            Log.e("anError", String.valueOf(anError.getErrorCode()));
                            a = false;
                        }
                    });
...