从现有片段启动其他片段时应用程序崩溃

Posted

技术标签:

【中文标题】从现有片段启动其他片段时应用程序崩溃【英文标题】:App crashes while launching other fragment from existing fragment 【发布时间】:2016-04-20 22:55:39 【问题描述】:

我正在使用导航抽屉,Fragment_1 包含一个列表视图,用于搜索 gps 位置,然后加载适配器。如果我将 Fragment_1 保持打开直到它完全加载,该过程就可以正常工作。但是,如果我在 Fragment_1 正在搜索位置或加载适配器时尝试打开另一个 Fragment_2,我的应用程序将崩溃。 Fragment_2 包含文本视图,如果单独启动,则可以正常工作。

我正在使用以下代码从抽屉中启动新片段

Fragment mFragment;
FragmentManager mFragmentManager = getSupportFragmentManager();
mFragment = new Fragment_2();                                

mFragmentManager.beginTransaction()
.replace(R.id.frame_container,mFragment)
.commit();

【问题讨论】:

请粘贴您的 logcat 输出 如果应用程序崩溃,那么您不应该发布您的 logcat 错误。没有这个,我们只能推测原因。 【参考方案1】:

您应该执行一个异步任务来加载列表。在替换当前片段之前,只需取消异步任务。如果任务未取消,请确保签入 onPostExecute。

您可以在此处找到将数据异步加载到回收器视图中的示例:http://javatechig.com/android/android-recyclerview-example。看看 AsyncHttpTask。您可以看到在 doInBackground 上获取和解析数据,并显示在 onPostExecute 中。您还需要在代码中添加以下内容:将 onPostExecute 中的所有内容包含在

if (!isCancelled()) 
    /* your code here for setting list adapter */

分离时覆盖:

@Override
public void onDetach() 
    super.onDetach();

    // don't update the UI if user go from this fragment
    if (displayResultsAsyncTask != null && !displayResultsAsyncTask.isCancelled())
        displayResultsAsyncTask.cancel(true);

所以你的代码应该是这样的:

public class YourFragment extends Fragment 
    // declare an async task in your fragment
    private AsyncTask displayResultsAsyncTask = null;
    /* other data here */

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) 
        /* your code for onCreate */
        GetAndDisplayResults(); // call display results
    

    public void GetAndDisplayResults() 
        displayResultsAsyncTask = new AsyncTask<String, Void, Integer>() 
            @Override
            protected Integer doInBackground(String... params) 
                Integer result = 0;

                // get and parse data, also set result

                return result;
            

            @Override
            protected void onPostExecute(Integer result) 
                if (!isCancelled()) 
                    // if task wasn't stopped 
                    if (result == 1)
                        SetYourList(); // set your list adapter based on results returned from doInBackground
                
            
        .execute();
    

    @Override
    public void onDetach() 
        super.onDetach();

        // don't update the UI if user go from this fragment
        if (displayResultsAsyncTask != null && !displayResultsAsyncTask.isCancelled())
            displayResultsAsyncTask.cancel(true);
    

用于保存数据的列表可以全局声明并从 doInBackground 和 onPostExecute 访问,也可以作为参数传递给 onPostExecute。

【讨论】:

如果片段需要被移除,这样做没有意义。 我正在使用改造来加载列表视图,你能告诉我如何实现吗?应用程序在找到位置并尝试加载适配器后崩溃。【参考方案2】:

看起来您正试图在onCreateonResume 方法之一中尝试commit fragmentTransaction,由于activity state loss 而导致异常IllegalStateException: Can not perform this action after onSaveInstanceState。请检查您是否在做这些功能。

希望这会有所帮助。

【讨论】:

是的,我在我的 onCreate 中调用它,有什么可能的解决方案? onPostResume() 将是您的解决方案 我正在使用改造来加载我的列表视图,你能告诉我在这种情况下可以做什么。 我没有使用改造,但了解流程并相应地实施事情。流程是在活动开始期间,您不应该提交事务。如果您正在使用一些网络服务进行响应,那么在收到响应时,您应该提交这些东西

以上是关于从现有片段启动其他片段时应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Firebase 获取数据到 Recyclerview 中的片段?

将片段与 GoogleMap 一起使用时应用程序崩溃

从其他片段启动视频视图片段时显示问题?

从mysql的片段中加载ListView

android studio中片段内的RecyclerView使我的应用程序崩溃

每当我尝试从 Fragment java 文件中更改片段的某些属性时,应用程序就会崩溃