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

时间:2016-01-15 10:56:25

标签: android listview android-fragments android-gps

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

我正在使用以下代码从抽屉

启动新片段
$sql_query = "INSERT INTO user_login (user_mobile, user_email, user_pwd) values('$mobile', '$email', '$password')";

2 个答案:

答案 0 :(得分: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声明为globaly并加入,也可以作为参数设置为onPostExecute。

答案 1 :(得分:0)

您似乎试图在commitfragmentTransaction方法中onCreate onResumeIllegalStateException: Can not perform this action after onSaveInstanceState而导致异常activity state loss 1}}。请检查您是否正在执行这些功能。

希望这有帮助。