使用Asynctask更新片段后查看重叠

时间:2013-12-08 22:44:08

标签: android android-fragments android-asynctask

我假装显示的是一个不确定的进度条(暂时只是一个用于测试目的的对话框),而我的第二个片段是获取数据并构建视图而不冻结UI。

我尝试了什么:

  • 的AsyncTask
  • 装载机
  • 使用AsyncTaskLoader加载
  • 适配器(未尝试但可能是它的选项,但我不知道如何 使用具有自定义布局的适配器)

使用asynctask方法几乎一切都是正确的,但onPostExecute我要更新片段来做这个我创建了一个接口,在主要活动中我删除了视图并添加了新视图,但是这个我创建了另一个问题我的后卫堆乱了,所以我没有选择。

帮助了解其工作原理的图表: enter image description here

我的片段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会将我的视图与之前的片段视图重叠

1 个答案:

答案 0 :(得分:1)

你的片段无头。所以不要实现onCreateView方法。将该代码移动到onCreate。然后在异步任务中,使用onPostExecute向父活动发送更新信息,以显示它。然后,此片段的父活动可以决定UI应如何对此信息做出反应。确保您避免与onPostExecute(或onPublishProgress,如果您正在更新)方法以外的任何地方的父活动进行通信,因为a)由于多种原因(包括设备轮换和b)这些方法,活动可以为null gauranteed在UI线程上运行