Android:应用程序在关闭并重新打开后崩溃

问题描述:

当用户关闭应用程序,然后尝试再次打开应用程序时,应用程序崩溃。这个类,因为某些原因,引起的麻烦:Android:应用程序在关闭并重新打开后崩溃

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(); 
       } 
       } 
      } 
     } 

    } 
} 

这是我得到的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) 

为什么会出现这种情况?我错过了什么吗?

+0

它为什么调用恢复活动?原来的那个不应该在关闭时被销毁? –

+0

通过关闭,我的意思是,用户退出应用程序不会从最近的屏幕上“杀死”它 – Hudhud

+0

应用程序实例是否有可能未被销毁?就像在某些机器人中一样,如果按下home键,应用程序实际上不会关闭,但会在后台暂停。 –

注意

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

当应用程序被关闭,我想,MediaPlayer的状态不正确的处理。在重新启动应用程序时,媒体播放器的状态不同,但不支持开始播放。

我认为,当您关闭应用程序时,会调用onPause(),您会释放MediaPlayer实例。但是,当你重新启动应用程序(也许你从任务管理器的后台启动应用程序),没有初始化MediaPlayer,你尝试播放媒体。

+0

如果您将mediaPlayer设置为null onPause(),它应该解决这种情况。 – GreyBeardedGeek

+0

非常感谢! :) – Hudhud