android - 我应该在 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();
}
}
}
解决方案
onActivityCreated()
可以是你的选择,昂贵的工作应该在doInBackGround()
方法上完成。
推荐阅读
- angular - 如何使用 ngFor 向 div 添加分页功能
- three.js - 无法加载 .obj 和 .mtl
- c# - 如何转换线程代码(VB.net 到 C#)..?
- for-loop - 新使用 for 循环
- javascript - 如何在处理 HTTP 请求之前将 csv 文件同步加载到内存中
- javascript - 使用 javascript 从 ul li 获取每个层次结构级别的字符串行
- java - 打开 Eclipse 时收到错误消息,请参阅显示的日志文件错误消息
- batch-file - 如何区分 MS Access 和 Access Runtime 注册表项?
- r - R Igraph 子图给定节点索引和要包含在图中的节点数
- javascript - 如何刷新或重绘表格行