为什么加载长数据时应用程序冻结

时间:2020-08-19 13:51:53

标签: android

我在下面的Assets文件夹中有JSON本地文件,但有10,000多个对象,当我读取它们时,它花费了40秒钟以上的时间并冻结了该应用程序,所以有人可以解释我如何在Asynctask中做到这一点吗?

{
  "status": true,
  "result": [
    {
      "id": 22,
      "name": "T........",
    }
  ]
}

代码

try {
            InputStream inputStream = getAssets().open("LocalTest.json");
            byte[] buffer = new byte[inputStream.available()];
            inputStream.read(buffer);
            inputStream.close();
            String Categories = new String(buffer, "UTF-8");
            JSONObject jsonObject = new JSONObject(Categories);
            for (int x = 0; x < jsonObject.getJSONArray("result").length(); x++) {
                //Put data in array
            }
        } catch (JSONException | IOException e) {
            e.printStackTrace();
        }

我没有Asynctask的背景,所以有人可以帮忙转换吗?

可选:如果有可能增加进度并显示百分比,我会很高兴。

2 个答案:

答案 0 :(得分:0)

现在不推荐使用Asynctask。但是,您可以使用Thread作为示例:

const s3 = new S3({
  region: 'eu-central-1',
});

答案 1 :(得分:0)

不是创建新线程,而是必须使用AsyncTask类,它是用于Android后台任务的特殊类。您的代码段可能像下面的家伙。

创建一个名为FileReadAsyncTask的新类

public class FileReadAsyncTask extends AsyncTask<Void, Void, Void> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected Void doInBackground(Void... params) {
            try {
                InputStream inputStream = getAssets().open("LocalTest.json");
                byte[] buffer = new byte[inputStream.available()];
                inputStream.read(buffer);
                inputStream.close();
                String Categories = new String(buffer, "UTF-8");
                JSONObject jsonObject = new JSONObject(Categories);
                for (int x = 0; x < jsonObject.getJSONArray("result").length(); x++) {
                    //Put data in array
                }
            } catch (JSONException | IOException e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
        }

        @Override
        protected void onProgressUpdate(Void... values) {
            super.onProgressUpdate(values);
        }

        @Override
        protected void onCancelled(Void result) {
            super.onCancelled(result);
        }

    }

然后从MainActivity或另一个类中调用

 new FileReadAsyncTask ().execute((Void) null);