【发布时间】:2020-01-15 12:52:36
【问题描述】:
加载片段时,我必须对远程服务器进行昂贵的调用。我正在使用带有 NavigationView 的默认仪表板活动来更改片段。但是,无论何时加载片段,它都会在执行包含 SOAP 请求代码的 AsyncTask 时冻结 UI 几秒钟。
我已经尝试从 onAttach() 和 onStart() 执行 AsyncTask,但它仍然冻结 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();
}
}
}
【问题讨论】:
-
AnsyncTask 是一个 UI 非阻塞调用。你能在这里分享你的异步任务代码吗?所以我们可以看看
-
考虑为您的异步任务添加进度条。在 preExecute 你让它可见,你在 doIOnBackground 中调用,如果你想你可以更新它的进度,或者将它设置为不确定,当后台任务完成时,填充你的视图并去掉进度条。
标签: android android-fragments android-asynctask