我假装显示的是一个不确定的进度条(暂时只是一个用于测试目的的对话框),而我的第二个片段是获取数据并构建视图而不冻结UI。
我尝试了什么:
使用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
我的主要问题是如何在没有冻结UI的情况下初始化片段2时显示进度条,如果我的上述方法是正确的,那么在重工作完成之后如何更新片段中的视图asyncTask完成后台工作
删除所有视图并添加新视图后onBackpressed会将我的视图与之前的片段视图重叠
答案 0 :(得分:1)
你的片段无头。所以不要实现onCreateView方法。将该代码移动到onCreate。然后在异步任务中,使用onPostExecute向父活动发送更新信息,以显示它。然后,此片段的父活动可以决定UI应如何对此信息做出反应。确保您避免与onPostExecute(或onPublishProgress,如果您正在更新)方法以外的任何地方的父活动进行通信,因为a)由于多种原因(包括设备轮换和b)这些方法,活动可以为null gauranteed在UI线程上运行