【问题标题】:Load fragment view only once仅加载一次片段视图
【发布时间】:2013-10-16 14:11:06
【问题描述】:

我有以下内容。我有一个导航抽屉。当我单击一个项目时,主要内容框架会被另一个片段替换,具体取决于用户单击的内容。该片段然后启动一个异步任务来创建视图。我这样做是为了让应用程序不会卡住,并且用户实际上可以看到正在完成的事情。

我现在遇到的问题是,每次我单击该项目时,片段都会再次加载。我知道这是因为我在片段的 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);

        }

所以基本上有一个选项来检查布局是否已经被填充,如果是,我该怎么做,我应该把代码放在哪里?

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

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

但这只会在同一行给我一个 nullPointerException

【问题讨论】:

    标签: java android layout android-fragments android-asynctask


    【解决方案1】:

    在调用时使用无头片段

    setRetainInstance(true);
    

    防止它被破坏。

    查看这些链接了解更多信息:http://www.vogella.com/articles/AndroidBackgroundProcessing/article.html#fragmentsandbackgroundprocessing

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

    【讨论】:

    • 嗨,谢谢。我用谷歌搜索了一下,发现它应该放在 onCreateView 方法中。但这并没有改变任何东西。我到底应该把它放在哪里?我有 onCreate、onViewCreated 和 onCreateView。还是我必须将它设置在某个地方然后询问它是否正确? developer.android.com/reference/android/app/… 文档在那里并没有真正的帮助。
    • 是的,这正是我所做的 MainAsyncTask mainAsyncTask; @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);设置保留实例(真); if(mainAsyncTask != null){ new MainAsyncTask().execute(); } } 但它也没有工作。不过感谢您的帮助。将为您的努力投赞成票。 :)
    • 你不能只从教程中挑选几行代码就认为它会起作用。跟随他们,了解他们,然后将这些知识应用到您的情况中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多