gpt4 book ai didi

android - 在后台线程中工作,停止 UI 线程

转载 作者:行者123 更新时间:2023-11-29 23:31:32 24 4
gpt4 key购买 nike

我正在后台线程中获取和处理一些 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 是进度对话框...当我调用此函数时应用程序开始滞后,这是我在这里缺少的。

最佳答案

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

AsyncTask 类首先使用 execute() 方法执行。在第一步中,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);

关于android - 在后台线程中工作,停止 UI 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52585755/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com