从意图处理程序提交片段事务时出错

硼砂

我试图写一个简单的音乐播放器,并面对这样的问题。在我的UI中,我有几个片段,分别用于显示歌曲的不同模式(例如,所有音乐,选定文件夹中的音乐,播放列表中的音乐等)。我也有播放音乐的服务。

当用户关闭处于播放状态的播放器时,我想保存UI状态(即当前显示的片段),并在再次打开播放器后恢复该状态(如果用户关闭处于暂停状态的播放器,则不需要)。

为了保存状态,我使用Service上述的my onDestroy()我的活动方法中,我将恢复所需的所有数据放入了intent和call中startService(intent)服务将此数据保存到局部变量。onCreate()我的活动方法中,我startService故意调用,其中包含保存状态的请求。在使用中,我将保存的数据用于意图并将其发送到Activity使用LocalBroadcastManager.getInstance(this).sendBroadcast(intent)方法。BroadcastListener我的内部课堂中,我Activity收到了这个意图并提取了数据。看来还可以。

但是问题开始于当我尝试还原Fragments用户关闭播放器时显示的内容时。应用程序崩溃与unhandled exception.这里是堆栈:

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
        at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1377)
        at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1395)
        at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:637)
        at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:616)
        at com.borune.test.MainActivity.switchFragments(MainActivity.java:58)
        at com.borune.test.MainActivity$MyServiceListener.onReceive(MainActivity.java:102)
        at android.support.v4.content.LocalBroadcastManager.executePendingBroadcasts(LocalBroadcastManager.java:297)
        at android.support.v4.content.LocalBroadcastManager.access$000(LocalBroadcastManager.java:46)
        at android.support.v4.content.LocalBroadcastManager$1.handleMessage(LocalBroadcastManager.java:116)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:136)
        at android.app.ActivityThread.main(ActivityThread.java:5032)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
        at dalvik.system.NativeStart.main(Native Method)

我已经搜寻了这个例外,但是所有提议的解决方案都无法解决我的问题。我写了一个简单的项目重复描述的问题。这是代码:

MainActivity.java

public class MainActivity extends ActionBarActivity {

private int current_fragment;
private FragmentA fragmentA = null;
private FragmentB fragmentB = null;
private MyServiceListener myServiceListener;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    current_fragment = 1;
    switchFragments(null);
    myServiceListener = new MyServiceListener();

    LocalBroadcastManager.getInstance(this).registerReceiver(myServiceListener,new IntentFilter(MyService.RESPONSE_RESTORE));

    requestState();
}

public void switchFragments(View view) {
    switch(current_fragment) {
        case 1 : {
            if(fragmentA == null) {
                fragmentA = FragmentA.newInstance();
            }

            FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
            transaction.replace(R.id.container, fragmentA);
            current_fragment = 1;
            transaction.commit();

            current_fragment = 2;

            break;
        }
        case 2 : {
            if(fragmentB == null) {
                fragmentB = FragmentB.newInstance();
            }

            FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
            transaction.replace(R.id.container, fragmentB);
            current_fragment = 1;
            transaction.commit();

            current_fragment = 1;

            break;
        }

    }
}

protected void onDestroy(){
    super.onDestroy();

    Log.d("log", "onDestroy() called, saving fragment number");
    Intent intent = new Intent(this,MyService.class);
    intent.setAction(MyService.SAVE_STATE);
    intent.putExtra(MyService.FRAGMENT_NUMBER,current_fragment);
    startService(intent);
}


private class MyServiceListener extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();

        if(action.equals(MyService.RESPONSE_RESTORE)) {
            current_fragment = intent.getIntExtra(MyService.FRAGMENT_NUMBER,-1);
            Log.d("log", "received fragment number, restoring now");
            switchFragments(null);
        }
    }
}

private void requestState() {
    Intent intent = new Intent(this,MyService.class);
    intent.setAction(MyService.REQUEST_RESTORE);
    startService(intent);
 }
 }

MyService.java

public class MyService extends Service {

public static final String REQUEST_RESTORE = "action.REQUEST_RESTORE";
public static final String RESPONSE_RESTORE = "action.RESPONSE_RESTORE";
public static final String SAVE_STATE = "action.SAVE_STATE";
public static final String FRAGMENT_NUMBER = "FRAGMENT_NUMBER";

private int fragment_number = -1;

public MyService() {
}

@Override
public IBinder onBind(Intent intent) {
    return null;
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {

    String action = intent.getAction();
    if(action.equals(REQUEST_RESTORE)) {
        if(fragment_number != -1)
            sendState();
    } else if (action.equals(SAVE_STATE)) {
        fragment_number = intent.getIntExtra(FRAGMENT_NUMBER,-1);
    }
    return START_NOT_STICKY;
}

private void sendState() {
    Intent intent = new Intent(RESPONSE_RESTORE);
    intent.putExtra(FRAGMENT_NUMBER,fragment_number);
    LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
 }
 }

在这个程序我有容器和布局Buttonandroid:onClick="switchFragments"关闭应用程序并再次打开后,我收到相同的异常。

谁能解释我,为什么会出现此错误以及如何解决呢?

雷兹贝尔

该线程将解释发生了什么:获取异常“ IllegalStateException:在onSaveInstanceState之后无法执行此操作”

答案简短,但可能很危险:使用commitAllowingStateLoss()代替commit(),但如果不小心,可能会破坏某些东西。

关于我所做的事情,我创建了一个名为“ isSafeToCommitFragment”的布尔标志,默认将其设置为false,然后将值分配给Activity生命周期,如下所示:

  • onDestroy():假
  • onPause():否
  • onResume():假
  • onStart():false
  • onStop():否
  • onPostResume():是

调用之前fragmentTransaction.commit(),请按以下步骤检查标志:

if (isSafeToCommitFragment) {
    fragmentTransaction.commit();
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

片段中的“接收广播意图时出错”

来自分类Dev

从片段调用意图时出错(用户登录)

来自分类Dev

Hibernate javax.persistence.RollbackException:提交事务时出错

来自分类Dev

尝试再次创建片段时调用提交时出错

来自分类Dev

处理片段列表视图时出错,找不到符号“列表”

来自分类Dev

使用onClickListener时出错(意图)

来自分类Dev

单击后退按钮时对片段之间的事务进行动画处理

来自分类Dev

将应用程序提交到iTunesConnect时出错

来自分类Dev

使用启动引导程序“ Agency”主题提交表单时出错

来自分类Dev

如何添加事件处理程序在sqlalchemy中提交事务后仅触发一次

来自分类Dev

如何添加事件处理程序仅在sqlalchemy中提交事务后触发一次

来自分类Dev

片段的静态处理程序?

来自分类Dev

在视图中执行处理程序的子请求时出错

来自分类Dev

处理程序包shim签名时出错

来自分类Dev

Android:插入片段时出错

来自分类Dev

夸大类片段时出错。

来自分类Dev

膨胀类片段时出错

来自分类Dev

在FragmentTab中使用额外的意图时出错

来自分类Dev

在初始化意图时出错

来自分类Dev

接收广播意图时出错。Eclipse Paho

来自分类Dev

在AlertDialog内部创建意图时出错

来自分类Dev

Android-接收广播意图时出错?

来自分类Dev

接收广播意图时出错。Eclipse Paho

来自分类Dev

处理python时出错

来自分类Dev

处理HTTPError时出错

来自分类Dev

在执行postgreql函数时提交事务

来自分类Dev

在方法结束时未提交事务

来自分类Dev

与Hibernate提交事务时发生ConcurrentModificationException

来自分类Dev

svn:提交事务时发生错误