【发布时间】:2013-12-08 22:44:08
【问题描述】:
我假装是显示一个不确定的进度条(目前只是一个用于测试目的的对话框),而我的第二个片段正在获取数据并在不冻结 UI 的情况下构建视图。
我尝试过的:
- 异步任务
- 加载器
- 带 AsyncTaskLoader 的加载器
- 适配器(未尝试但可能是一个选项,但我不知道如何 使用带有自定义布局的适配器)
使用 asynctask 方法几乎一切都是正确的,但是 onPostExecute 我必须更新片段才能做到这一点,我创建了一个界面,在主活动中我删除了视图并添加了新的视图,但是这样我又产生了另一个问题我的后台堆栈搞砸了,所以我没有选择。
帮助理解其工作原理的图表:
我的片段 2:
public class FragTopics extends Fragment {
Object course;
ManSession session;
String courseId;
Long topicId;
String courseName;
private LinearLayout mainLayout;
private ScrollView contentScrollable;
private LinearLayout contentsLayout;
private View myView;
public FragTopics() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
session = new ManSession(getActivity().getApplicationContext());
courseId = getArguments().getString("courseId");
topicId = Long.parseLong(getArguments().getString("topicId"));
courseName = getArguments().getString("courseName");
new HeavyWork().execute();
// Create empty view because i need to return something
myView = new View(getActivity());
return myView;
}
private class HeavyWork extends AsyncTask<Void, Void, Void> {
private ProgressDialog dialog;
final FragmentUpdater activity = (FragmentUpdater) getActivity();
// Do the long-running work in here
@Override
protected Void doInBackground(Void... params) {
MoodleCourseContent[] courseTopics = new ManContents(getActivity()
.getApplicationContext()).getContent(courseId);
MoodleCourseContent singleTopic = new ManContents(getActivity()
.getApplicationContext()).getTopic(topicId, courseTopics);
// This createTopics call another methods from the fragment class to
// get the data and create views
myView = createTopics(singleTopic, courseName, courseId, topicId);
return null;
}
protected void onPreExecute() {
dialog = new ProgressDialog(getActivity());
dialog.show();
}
// This is called when doInBackground() is finished
@Override
protected void onPostExecute(Void ignore) {
activity.updater(myView);
dialog.dismiss();
}
}
我的界面:
public interface FragmentUpdater {
public void updater(View param);
}
我实现接口的主要活动:
@Override
public void updater(View param) {
ViewGroup vg = (ViewGroup) findViewById (R.id.main_content);
vg.removeAllViews();
vg.addView(param);
}
我的布局是程序化创建的,这是结构:
->LinearLayout
->TextView
->ScrollView
->LinearLayout
我的主要问题是如何在片段 2 初始化时显示进度条而不冻结 UI,如果我的上述方法是正确的,那么在完成繁重工作后如何更新片段中的视图,换句话说asyncTask 完成后台工作
删除所有视图并添加新视图后,onBackpressed 将与之前的片段视图重叠我的视图
【问题讨论】:
-
你的主要问题是什么?我不明白你在问什么?
-
我更新了问题,我的主要问题是如何在片段 2 初始化时显示进度条而不冻结 UI,如果我的上述方法是正确的,如何在片段之后更新视图换句话说,在 asyncTask 完成后台工作之后完成了重工作。但是在给出负分之前阅读所有内容
标签: android android-fragments android-asynctask