在 SQLite 上存储 1000 多个数据导致 UI 挂起

Storing 1000+ data on SQLite resulting UI Hang

我需要根据我们服务器的响应在 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() 循环真的有用吗?或者它只是一个创可贴解决方案?

问题三:ProgressDialog加载动画时如何避免lag/hang?

这样改代码怎么样

//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;
                        }
                    });

我解决 it.I 认为在 SQLiteDatabase 中插入数据是造成 UI 滞后的原因。由于 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);
}