从现有片段启动其他片段时应用程序崩溃
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】:看起来您正试图在onCreate
、onResume
方法之一中尝试commit
fragmentTransaction
,由于activity state loss
而导致异常IllegalStateException: Can not perform this action after onSaveInstanceState
。请检查您是否在做这些功能。
希望这会有所帮助。
【讨论】:
是的,我在我的 onCreate 中调用它,有什么可能的解决方案?onPostResume()
将是您的解决方案
我正在使用改造来加载我的列表视图,你能告诉我在这种情况下可以做什么。
我没有使用改造,但了解流程并相应地实施事情。流程是在活动开始期间,您不应该提交事务。如果您正在使用一些网络服务进行响应,那么在收到响应时,您应该提交这些东西以上是关于从现有片段启动其他片段时应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Firebase 获取数据到 Recyclerview 中的片段?