我正在后台线程中获取和处理一些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是进度对话框...当我将此功能称为我在这里缺少的功能时,应用程序开始滞后。
答案 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);