从处理程序postDelayed的Internet替代中获取数据时保持UI响应

问题描述 投票:-1回答:2

我有一个从互联网上获取的ArrayList。现在,我使用后处理的Handler执行列表检索。就像下面在活动的onCreate中一样。

new Handler().postDelayed(new Runnable() {
    @Override
    public void run() {

            lis_dat.remove(lis_dat.size() - 1);
            if (gri_not_lis) {
                rv_3r_ada.notifyItemRemoved(lis_dat.size());
            } else {
                rv_3r_2c_ada.notifyItemRemoved(lis_dat.size());
            }
            List<String> lis_of_dat;
            int cou = 0, pos = lis_dat.size();
            String gen_sta, gen_end, gen_mon;
            if (yea) {
                String[] mon_sym = new DateFormatSymbols().getMonths();
                lis_of_dat = Arrays.asList(mon_sym);
            } else {
                int how_man;
                if (lis_is_new) {
                    how_man = 500;
                } else {
                    how_man = 15;
                }
                if (day_in_bet(sta, end) <= how_man) {
                    gen_sta = sta;
                    gen_end = end;
                } else {
                    gen_sta = sta;
                    Calendar cal = Calendar.getInstance();
                    cal.setTime(db_han.con_dat(sta));
                    cal.add(Calendar.DATE, how_man);
                    gen_end = USE_DAT.format(cal.getTime());
                }
                lis_of_dat = gen_dat_in_bet(gen_sta, gen_end);
            }
            for (String dat : lis_of_dat) {
                if (yea) {
                    Date date = get_mon_dat(dat, YEA.format(db_han.con_dat(sta)));
                    gen_sta = get_mon_fir_or_las_dat(date, true);
                    gen_end = get_mon_fir_or_las_dat(date, false);
                    gen_mon = dat;
                } else {
                    gen_sta = dat;
                    gen_end = null;
                    gen_mon = mon;
                }
                add_to_lis(gen_sta, gen_end, gen_mon, pos, gri_not_lis);
                pos++;
            }
            pos_f[0] = pos;
            cou_f[0] = cou;
            is_loa = false;
        }

}, 1000);

现在我的问题是,这1000毫秒在不同设备上可能有所不同。 UI将冻结在谁身上。那么,这有什么选择呢?不用等待1秒钟,我如何可以等到UI加载完成后再进行检索?

我可以使用AsyncTask,但即使我进行其他活动,任务也将一直运行直到任务完成。但是我不需要在onPause被调用后运行的任务。那我该怎么办?

java android
2个回答
0
投票

您可以使用在单独线程中运行的AsyncTask,使UI保持响应状态。您可以通过调用** asyncTaskRunner.cancel(true)**

在活动的onPause中将其取消
private class AsyncTaskRunner extends AsyncTask<String, String, String> {

    private String resp;
    ProgressDialog progressDialog;

    @Override
    protected String doInBackground(String... params) {

        return resp;
    }


    @Override
    protected void onPostExecute(String result) {

    }


    @Override
    protected void onPreExecute() {

    }


    @Override
    protected void onProgressUpdate(String... text) {


    }
}

0
投票

您可以保存处理程序的实例,然后删除其中的所有回调onPause活动。

private Handler handler = new Handler();

  handler.postDelayed(() -> {
            // do you task here

        },1000);

 @Override
    public void onPause() {
        super.onPause();
        handler.removeCallbacksAndMessages(null); // this is important
    }

并且,如果您想要不延迟而不会冻结UI的内容,你去那里

 @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Executors.newSingleThreadExecutor().submit(() -> {
            // Do you task here without any delay it will not freeze the UI
        });
    }
© www.soinside.com 2019 - 2024. All rights reserved.