2017-05-07 9 views
0

ユーザーがアプリケーションを閉じてからもう一度開くと、アプリケーションがクラッシュします。このクラスは、何らかの理由で、トラブルが発生します。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) 

これはなぜ起こるのでしょうか?私は何かを逃したか?アプリが閉じているときに、私が思うに、MediaPlayerのの状態が適切に処理されていない

+0

なぜ再開アクティビティを呼び出すのですか?閉鎖時に元のものは破壊されてはいけませんか? –

+0

閉じるとは、ユーザーがアプリを終了して最近の画面から「終了」しないことを意味します。 – Hudhud

+0

アプリケーションのインスタンスが破棄されていない可能性がありますか?いくつかのアンドロイドのように、ホームボタンを押すと、アプリケーションは実際には閉じず、バックグラウンドで一時停止します。 –

答えて

1

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

こと。アプリの再起動時に、メディアプレーヤーの状態は再生開始をサポートしていない場合とは異なります。

私はあなたがアプリケーションを閉じると、onPause()が呼び出されると思います。あなたはMediaPlayerインスタンスを解放します。しかし、アプリを再起動すると(タスクマネージャからバックグラウンドでアプリを起動するなど)、初期化されたMediaPlayerはなく、メディアを再生しようとします。

+0

最後のonPause()でmediaPlayerをnullに設定すると、この状況を修正する必要があります。 – GreyBeardedGeek

+0

ありがとうございます! :) – Hudhud

関連する問題