首页 > 解决方案 > 我应该在 Fragment 中的什么生命周期状态下执行异步任务?

问题描述

加载片段时,我必须对远程服务器进行昂贵的调用。我正在使用带有 NavigationView 的默认仪表板活动来更改片段。但是,无论何时加载片段,它都会在执行包含 SOAP 请求代码的 AsyncTask 时冻结 UI 几秒钟。

我已经尝试执行 AsyncTask onAttach()onStart()但它仍然冻结 UI。

如何修复 UI 冻结?

编辑:-异步任务代码:-

private class BindTreasuryTask extends AsyncTask<Void,Void,ArrayList<TreasuryData>> {

        private boolean NO_INTERNET;

        @Override
        protected ArrayList<TreasuryData> doInBackground(Void... voids) {
            try {
                // SOAP Call returns a JSONArray
                JSONArray jsonArray = apiHandler.performBindTreasury(payeeid);
                ArrayList<TreasuryData> td = new ArrayList<>();
                td.add(new TreasuryData("Select a treasury","none","none"));
                for(int i =0; i<jsonArray.size(); i++){
                    JSONObject j = (JSONObject) jsonArray.get(i);
                    td.add(new TreasuryData(j.get("TREASURY_NAME"),j.get("TREAS_CODE"),j.get("SCHEMA_NM")));
                }
                return td;
            } catch (IOException e) {
                NO_INTERNET = true;
                e.printStackTrace();
            } catch (XmlPullParserException | ParseException e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(ArrayList<TreasuryData> treasuryData ) {
            if (treasuryData == null){
                if (NO_INTERNET){
                    Toast.makeText(getActivity(),"No Internet Connection",Toast.LENGTH_LONG).show();
                }
            } else {
                ArrayList<String> treasury = new ArrayList<>();
                for(int i=0;i<treasuryData.size();i++){
                    treasury.add(treasuryData.get(i).getTreasuryName());
                }
                setUpView();
            }
        }
    }

标签: androidandroid-fragmentsandroid-asynctask

解决方案


onActivityCreated()可以是你的选择,昂贵的工作应该在doInBackGround()方法上完成。


推荐阅读