繁体   English   中英

只能加载片段视图一次

[英]Load fragment view only once

我有以下几点。 我有一个导航抽屉。 当我单击一项时,取决于用户单击的内容,主要内容框架将替换为另一片段。 然后,该片段启动asynctask来创建视图。 我这样做是为了使应用程序不会卡住,用户实际上可以看到已经完成了某些事情。

我现在遇到的问题是,每次我单击该项目时,片段都会再次加载。 我知道这是因为我正在片段的onCreate方法中调用AsyncTask,但是是否已经解决了如何在已经加载一次后不再重新加载整个事情呢?

长话短说:

我有一个充满数据的片段。 我不希望用户认为应用程序卡住了,所以我添加了进度栏和异步任务,以便用户可以看到正在完成某件事。

问题是,当我单击一项时,应用程序会再次加载所有内容。 解决方案我希望在片段被保存后立即加载而不再次调用。

这是我的代码。 我将其缩小,因此您不需要阅读太多。 只需使用最少的行

主片段

@Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        new MainAsyncTask().execute();
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState){

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        StrictMode.setThreadPolicy(policy);
        View rootView = inflater.inflate(R.layout.main_fragment, container, false);
        rl = (RelativeLayout) rootView.findViewById(R.id.mainRelativeLayout);
        sv = (ScrollView) rootView.findViewById(R.id.mainScrollView);
        ll = (LinearLayout) rootView.findViewById(R.id.mainListView);
        progressBar = (ProgressBar) rootView.findViewById(R.id.progressBar1);
        return rootView;
    }

异步任务

private class MainAsyncTask extends AsyncTask<Void, Void, Void> {

        TextView[] source;
@Override
        protected void onPreExecute() {
//          super.onPreExecute();
            progress = 0;
        }

        @Override
        protected Void doInBackground(Void... params) {
            source      = new TextView[todayHashMapSize];
for (int i = 0; i < todayHashMapSize; i++) {

                source[i]       = new TextView(getActivity());
}
return null
}

protected void publishProgress(int value) {
               progressBar.setProgress(value);
        }

        @Override
        protected void onPostExecute(Void result){
            for (int i = 0; i < todayHashMapSize; i++) {
                ll.addView(source[i]);


            }
            ll.removeView(progressBar);

        }

因此,基本上有一个选项可以检查是否已经填充了布局,如果可以的话,该怎么做?将代码放在哪里?

我的方法是检查是否有孩子

if(ll.getChildCount() == 0){
        new MainAsyncTask().execute();
    }

但这只是在完全相同的行上提供了一个nullPointerException

使用无头片段调用

setRetainInstance(true);

防止它被破坏。

有关更多信息,请参见以下链接: http : //www.vogella.com/articles/AndroidBackgroundProcessing/article.html#fragmentsandbackgroundprocessing

http://creeder.com/?&page=AsyncTask

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM