简体   繁体   中英

Android: App crashes after closing and reopening

When the user closes the app and then tries to open it again the app crashes. This class, for some reason, causes the trouble:

public class PageFragment_Bon extends Fragment implements View.OnClickListener{

public static final String ARG_PAGE = "ARG_PAGE";

private int mPage;
private Button start, stop, replay;
private MediaPlayer mediaPlayer;
int [] filer = new int[18];


public static PageFragment_Bon newInstance(int page) {
    Bundle args = new Bundle();
    args.putInt(ARG_PAGE, page);
    PageFragment_Bon fragment = new PageFragment_Bon();
    fragment.setArguments(args);
    return fragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mPage = getArguments().getInt(ARG_PAGE);
       }

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_boenner, container, false);

    start = (Button) view.findViewById(R.id.start);
    start.setOnClickListener(this);

    stop = (Button) view.findViewById(R.id.stop);
    stop.setOnClickListener(this);

    replay = (Button) view.findViewById(R.id.replay);
    replay.setOnClickListener(this);

    filer[2] = R.raw.takbira;
    filer[4] = R.raw.alfatiha;
    filer[14] = R.raw.tashahhud;
    filer[15] = R.raw.salat;
    filer[16] = R.raw.assalam;

    if(filer[mPage] != 0){
        start.setVisibility(View.VISIBLE);
        stop.setVisibility(View.VISIBLE);
        replay.setVisibility(View.VISIBLE);
    }

    return view;
}

@Override
public void onPause() {
    super.onPause();

    if(mediaPlayer != null)
    {
        mediaPlayer.stop();
        mediaPlayer.reset();
        mediaPlayer.release();
    }

}

@Override
public void onClick(View v) {

    if(mediaPlayer == null)
        mediaPlayer = MediaPlayer.create(getActivity().getBaseContext(), filer[mPage]);//add this line

    if(v == start){
            try {
                mediaPlayer.start();
            } catch (Exception e) {
                e.printStackTrace();
            }
    }

    else if(v == stop){
        mediaPlayer.pause();
    }

    else if(v == replay){
        mediaPlayer.seekTo(0);
        mediaPlayer.start();
    }
}


@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);

    if(!isVisibleToUser){

        if(mediaPlayer!=null) {
            if (mediaPlayer.isPlaying()) {
                try {
                    mediaPlayer.pause();
                    mediaPlayer.seekTo(0);

                } catch (Exception e) {
                    e.printStackTrace();
                }
                }
            }
        }

    }
}

This is what I get in the logcat:

05-07 13:56:06.726 31550-31550/com.app.hudhud.myapp E/AndroidRuntime: FATAL EXCEPTION: main
                                                                  Process: com.app.hudhud.myapp, PID: 31550
                                                                  java.lang.RuntimeException: Unable to resume activity {com.app.hudhud.myapp/com.app.hudhud.myapp.Bon}: java.lang.IllegalStateException
                                                                      at android.app.ActivityThread.performResumeActivity(ActivityThread.java:4156)
                                                                      at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:4250)
                                                                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1839)
                                                                      at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                      at android.os.Looper.loop(Looper.java:158)
                                                                      at android.app.ActivityThread.main(ActivityThread.java:7229)
                                                                      at java.lang.reflect.Method.invoke(Native Method)
                                                                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
                                                                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
                                                                   Caused by: java.lang.IllegalStateException
                                                                      at android.media.MediaPlayer._start(Native Method)
                                                                      at android.media.MediaPlayer.start(MediaPlayer.java:1425)
                                                                      at com.app.hudhud.myapp.PageFragment_Bon.onResume(PageFragment_Bon.java:148)
                                                                      at android.support.v4.app.Fragment.performResume(Fragment.java:2235)
                                                                      at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1346)
                                                                      at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1528)
                                                                      at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1595)
                                                                      at android.support.v4.app.FragmentManagerImpl.dispatchResume(FragmentManager.java:2898)
                                                                      at android.support.v4.app.FragmentController.dispatchResume(FragmentController.java:223)
                                                                      at android.support.v4.app.FragmentActivity.onResumeFragments(FragmentActivity.java:509)
                                                                      at android.support.v4.app.FragmentActivity.onPostResume(FragmentActivity.java:498)
                                                                      at android.support.v7.app.AppCompatActivity.onPostResume(AppCompatActivity.java:172)
                                                                      at android.app.Activity.performResume(Activity.java:7016)
                                                                      at android.app.ActivityThread.performResumeActivity(ActivityThread.java:4145)
                                                                      at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:4250) 
                                                                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1839) 
                                                                      at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                      at android.os.Looper.loop(Looper.java:158) 
                                                                      at android.app.ActivityThread.main(ActivityThread.java:7229) 
                                                                      at java.lang.reflect.Method.invoke(Native Method) 
                                                                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
                                                                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 

Why does this happen? Have I missed something?

Note that

Caused by: java.lang.IllegalStateException
at android.media.MediaPlayer._start(Native Method)

When app is closed, I think, MediaPlayer's state is not properly handled. On relaunching app, media player's state is different whic does not support to start playing.

I think, when you close app, onPause() is invoked, you release MediaPlayer instance. But when you relaunch app (maybe you launch app from background from task manager), there is no initialized MediaPlayer and you try to play media.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM