在后台线程中停止UI线程工作

时间:2018-10-01 06:40:33

标签: android json android-asynctask background-thread

我正在后台线程中获取和处理一些JSON数据...即使这样,我仍然可以在日志中看到警告,指出该应用程序在ht ui线程中做过多的工作。我不明白怎么了。

这是我的方法:

     private void getLists1() {
            busy =true;
            runOnUiThread(()->{
                listPD.show();
            });
            MyAsyncTask1 asyncTask1 = new MyAsyncTask1((String output) -> {
                if (!output.equals("failed")) {
                    runOnUiThread(()->{
                        listPD.setMessage("getting expense list");
                    });
                    JSONObject jsonObject = new JSONObject(output);
                    JSONArray array = jsonObject.getJSONArray("records_et");
                    int ii = array.length();
                    for (int i = 0; i < ii; i++) {
                        JSONObject jsonObject1 = array.getJSONObject(i);
                        String id = jsonObject1.getString("id");
                        String name1 = jsonObject1.getString("name");
                        int finalI = i;

                        listDB.insertItem(name1, id);

                    }
                    runOnUiThread(()->{
                        listPD.setMessage("expense list saved");
                    });

                }
            });
            asyncTask1.executeOnExecutor((AsyncTask.THREAD_POOL_EXECUTOR), "http://webservice");
            MyAsyncTask1 asyncTask2 = new MyAsyncTask1(output1 -> {
                if (!output1.equals("failed")) {
                    Log.i("response", "vendor " + output1);
                    runOnUiThread(()->{
                        listPD.setMessage("getting vendor list");
                    });
                    //vendor list
                    JSONObject jsonObject12 = new JSONObject(output1);
                    JSONArray array1 = jsonObject12.getJSONArray("records_vendor");
                    int ii1 = array1.length();

                    for (int i = 0; i < ii1; i++) {
                        JSONObject jsonObject1 = array1.getJSONObject(i);
                        String id = jsonObject1.getString("id");
                        String name1 = jsonObject1.getString("name");
                        int finalI = i;

                        listDB.insertVendorItem(name1, id);
                    }
                    runOnUiThread(()->{
                        listPD.setMessage("vendor list saved");
listPD.dismiss();
                    });

                }
            });
            asyncTask2.executeOnExecutor((AsyncTask.THREAD_POOL_EXECUTOR), "http://webservice");
    }

我这样调用方法;​​

new Thread(()->{
getLists1();
}).start();

listPD是进度对话框...当我将此功能称为我在这里缺少的功能时,应用程序开始滞后。

1 个答案:

答案 0 :(得分:1)

AsyncTask类用于执行将更新UI(用户界面)的后台操作。主要是我们将其用于不会影响主线程的简短操作。

首先使用execute()方法执行AsyncTask类。在第一步中,将AsyncTask称为onPreExecute(),然后onPreExecute()调用doInBackground()进行后台进程,然后doInBackground()调用onPostExecute()方法来更新UI。请遵循以下语法以使用AsyncTask

Android中AsyncTask的语法:

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
protected Long doInBackground(URL... urls) {
    // code that will run in the background
    return ;
}

protected void onProgressUpdate(Integer... progress) {
    // receive progress updates from doInBackground
}

protected void onPostExecute(Long result) {
    // update the UI after background processes completes
}

}

从主线程执行AsyncTask类:

new DownloadFilesTask().execute(url1, url2, url3);