2013-05-25 1 views
0

Привет, вот мой код, что я пытался сделать, это сначала одно изображение появляется в фоновом режиме (touch2) после того, как я коснусь экрана, которые начинают появляться. Итак, где проблема?Исключительное исключение указателя в onDestroy()

Проблема заключается в том, что перед тем, как коснуться экрана, и когда я увижу изображение touch2, если я нажму кнопку «Назад», я получу силу и ошибку в лог-коте, которая говорит, что активность не может уничтожить из-за нулевого указателя. Вот мой код

RelativeLayout psirenlayout; 
MediaPlayer mp; 
private boolean played; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    //full screeen 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
     WindowManager.LayoutParams.FLAG_FULLSCREEN); 
    //full screen 
    setContentView(R.layout.constrc); 
    //brightness full 
    WindowManager.LayoutParams lp = getWindow().getAttributes(); 
    lp.screenBrightness = 100/100.0f; 
    //brightness full 
    psirenlayout = (RelativeLayout) findViewById(R.id.psirenlayout); 
    this.psirenlayout.setBackgroundResource(R.drawable.touch2); 
    played=false; 



    psirenlayout.setOnTouchListener(new OnTouchListener() { 


@SuppressWarnings("deprecation") 
@Override 
public boolean onTouch(View v, MotionEvent event) { 
    int DELAY = 80; 
    if (!played){ 
     playSound(); 
     played=true; 
     } 
      if(event.getAction() == MotionEvent.ACTION_UP) {  
    final RelativeLayout psirenlayout = ((RelativeLayout) findViewById(R.id.psirenlayout)); 
    ColorDrawable f = new ColorDrawable(0xffff0000); 
    ColorDrawable f2 = new ColorDrawable(0xffff7f00); 
    ColorDrawable f3 = new ColorDrawable(0xffffff00); 
    ColorDrawable f4 = new ColorDrawable(0xff00ff00); 
    ColorDrawable f5 = new ColorDrawable(0xff00ffff); 
    ColorDrawable f6 = new ColorDrawable(0xff0000ff); 
    ColorDrawable f7 = new ColorDrawable(0xff8b00ff); 
    ColorDrawable f8 = new ColorDrawable(0xffff0000); 
    ColorDrawable f9 = new ColorDrawable(0xffff7f00); 
    ColorDrawable f10 = new ColorDrawable(0xffffff00); 
    ColorDrawable f11 = new ColorDrawable(0xff00ffff); 
    ColorDrawable f12 = new ColorDrawable(0xff0000ff); 
    ColorDrawable f13 = new ColorDrawable(0xff8b00ff); 




    AnimationDrawable a = new AnimationDrawable(); 

    a.addFrame(f, DELAY); 
    a.addFrame(f2, DELAY); 
    a.addFrame(f3, DELAY); 
    a.addFrame(f4, DELAY); 
    a.addFrame(f5, DELAY); 
    a.addFrame(f6, DELAY); 
    a.addFrame(f7, DELAY); 
    a.addFrame(f8, DELAY); 
    a.addFrame(f9, DELAY); 
    a.addFrame(f10, DELAY); 
    a.addFrame(f11, DELAY); 
    a.addFrame(f12, DELAY); 
    a.addFrame(f13, DELAY); 


    a.setOneShot(false); 

    psirenlayout.setBackgroundDrawable(a); // is deprecated API 16 
    //psirenlayout.setBackground(a); // API 16 
    a.start(); 
      } 
     return true; 
    } 
    }); 
} 
    private void playSound(){ 
     mp = MediaPlayer.create(disco.this, R.raw.disco); 
    mp.setOnCompletionListener(new OnCompletionListener() { 

     @Override 
     public void onCompletion(MediaPlayer mp) { 

      mp.release(); 
     } 
    }); 
    mp.setLooping(true); 
    mp.start(); 
} 

    @Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) 
    { 
     if ((keyCode == KeyEvent.KEYCODE_BACK)) 
     { 
      mp.stop(); 
      finish(); 
     } 
     return super.onKeyDown(keyCode, event); 
    } 

    @Override 
    protected void onPause() { 
    super.onDestroy(); 

    } 
    @Override 
     protected void onDestroy() { 
     mp.stop(); 
     super.onDestroy(); 


     } 
@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.mymenu, menu); 
    return true; 
} 

} 

Я попробовал все на остановке на уничтожить! Я получаю эту ошибку все время после того, как я нахожу силу закрыть программу dosent закрывает, она возвращается к mainActivity, что странно.

25 15: 29: 49,543: Е/AndroidRuntime (11154): неустранимые: Основной 05-25 15: 29: 49,543: Е/AndroidRuntime (11154): java.lang.NullPointerException 05-25 15: 29: 49.543: E/AndroidRuntime (11154): at com.soheil.prolight.disco.onKeyDown (disco.java:120) 05-25 15: 29: 49.543: E/AndroidRuntime (11154): у android. view.KeyEvent.dispatch (KeyEvent.java:2609) 05-25 15: 29: 49.543: E/AndroidRuntime (11154): at android.app.Activity.dispatchKeyEvent (Activity.java:2375) 05-25 15: 29: 49.543: E/AndroidRuntime (11154): at com.android.internal.policy.impl.PhoneWindow $ DecorView.dispatchKeyEvent (PhoneWindow.java:1847) 05-25 15: 29: 49.543: E/AndroidRuntime (1115) 4): at android.view.ViewRootImpl.deliverKeyEventPostIme (ViewRootImpl.java:3701) 05-25 15: 29: 49.543: E/AndroidRuntime (11154): at android.view.ViewRootImpl.handleImeFinishedEvent (ViewRootImpl.java:3651) 05-25 15: 29: 49.543: E/AndroidRuntime (11154): at android.view.ViewRootImpl $ ViewRootHandler.handleMessage (ViewRootImpl.java:2818) 05-25 15: 29: 49.543: E/AndroidRuntime (11154) : at android.os.Handler.dispatchMessage (Handler.java:99) 05-25 15: 29: 49.543: E/AndroidRuntime (11154): at android.os.Looper.loop (Looper.java:137) 05 -25 15: 29: 49.543: E/AndroidRuntime (11154): at android.app.ActivityThread.main (ActivityThread.java:5041) 05-25 15: 29: 49.543: E/AndroidRuntime (11154): в java. lang.reflect.Method.invokeNative (родной метод) 05-25 15: 29: 49.543: E/AndroidRuntime (11154): в java .lang.reflect.Method.invoke (Method.java:511) 05-25 15: 29: 49.543: E/AndroidRuntime (11154): at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java : 793) 05-25 15: 29: 49,543: Е/AndroidRuntime (11154): в com.android.internal.os.ZygoteInit.main (ZygoteInit.java:560)

+0

вы должны остановить t он mediaplayer в onPause(). if (mp! = null) {mp.stop(); } mp.stop() ;. in onDestory(). – Raghunandan

+0

теперь я получаю эту ошибку <05-25 15:41:28.203: E/AndroidRuntime (11542): FATAL EXCEPTION: main 05-25 15: 41: 28.203: E/AndroidRuntime (11542): android.app.SuperNotCalledException: Activity {com.soheil.prolight/com.soheil.prolight. disco} не звонил в super.onDestroy() – Soheyl

+0

tnx mate его исправлено: D – Soheyl

ответ

3

Поместите if(mp != null) { } вокруг mp.stop(); в методе onDestroy(). Возможно, вы пытаетесь остановить MediaPlayer, когда он еще не был инициализирован.

Метод OnDestroy() становится:

@Override 
protected void onDestroy() { 
    if(mp != null) { 
     mp.stop(); 
    } 
    super.onDestroy(); 
} 
+0

Я изменил код на этот – Soheyl

0

вызова OnDestroy внутри OnPause не прав ...
- OnCreate является базовым компонентам установки
- OnDestroy это делать любую Cleanup
- и если вы хотите запускать или останавливать действия и потоки, связанные с приложением, лучше полагаться на onResume и onPause

@Override 
    protected void onPause() { 
     if (mp!=null) { mp.stop(); } 

    } 
    @Override 
     protected void onDestroy() { 
     super.onDestroy(); 
     }