2011-01-25 6 views
0

메모리 누수가 있습니다. 여기에 코드android에서 메모리 누수가 발생할 수 있습니다. 잘못된 정리 방법을 사용하거나 무언가가 누락되었을 수 있습니다.

package fourguys.testing.IntentTest; 

import android.app.Activity; import android.media.MediaPlayer; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.media.MediaPlayer; import android.media.AudioManager; import android.content.Context; 

public class CanvasDrawingActivity extends Activity { 

    private static final int FIRE = 0; 
    private int initVolume = 0; 
    private Handler handler; 
    private MyCanvas v; 
    private MediaPlayer mp; 
    private AudioManager am; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     am = (AudioManager)this.getSystemService(Context.AUDIO_SERVICE); 

     // this method gets the current volume setting for music 
     initVolume = am.getStreamVolume(AudioManager.STREAM_MUSIC); 


     am.setStreamVolume(AudioManager.STREAM_MUSIC,100,AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE); 

     mp = MediaPlayer.create(this, R.raw.test); 

     makeHandler(); 
     v =new MyCanvas(this); 
     new Thread(new Runnable(){ 
      @Override 
      public void run() { 
       while(true) 
       handler.sendEmptyMessage(FIRE); 
     }}).start(); 
     setContentView(v); 
     mp.setLooping(true); 
     mp.start(); 
    } 
    private void makeHandler() 
    { 
     handler = new Handler(){ 

      @Override 
      public void handleMessage(Message msg) { 
       switch(msg.what) 
       { 
        case FIRE: 
        { 
         v.invalidate(); 
         break; 
        } 
       } 
      } 

     }; 
    } 
    protected void onPause() { 
     super.onPause(); 
     mp.stop(); 
    } 
    protected void onFinish() { 
     mp.stop(); 
    } 

} 

이있다 :

package fourguys.testing.IntentTest; 

import android.app.Activity; import android.content.Intent; import android.media.MediaPlayer; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.view.WindowManager; 

public class IntentTest extends Activity { /** Called when the activity is first created. */ 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 

     //reciever intentReceiver = new reciever(); 

     // IntentFilter intentFilter = new IntentFilter("com.app.REC"); 

     //registerReceiver(intentReceiver, intentFilter); 
     Button b = (Button)this.findViewById(R.id.endButton); 
     b.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Intent i = new Intent(IntentTest.this,CanvasDrawingActivity.class); 
       startActivity(i); 

      } 
     }); 
    } 
    // the onPause method get called when the app is either being hidden or being closed so this the place where we would want to clean anything up like stoping the media player. 
    @Override 
    protected void onPause() 
    { 
     super.onPause(); 
    } 
} 

내가 응용 프로그램을 실행하고 출구에 남았습니다 가져옵니다. 송수화기를 잠그고 배터리가 뜨거워집니다. 재부팅하려면 배터리를 물리적으로 당겨야합니다. 그 이유에 대한 어떤 생각? 그것은 에뮬레이터에서 환상적으로 실행됩니다. 대신 onFinish를 사용해야합니까, 아니면 무언가를 청소하지 않고 누락 되었습니까?

new Thread(new Runnable(){ 
      @Override 
      public void run() { 
       while(true) 
       handler.sendEmptyMessage(FIRE); 
     }}).start(); 

당신이 잘못 여기에 세 가지 명백한 일을하고 있습니다 :

+0

코드 뷰어가 이상하게 작동합니다. 죄송합니다. – user571866

답변

1

그것은 코드의 일부이다. 1) 당신은 그것을 죽이지 않고/또는 Activity#onPause에서 멈추지 않을 것입니다. 2) 당신은 전화하지 않습니다 setDaemon(true); 이로 인해 프로세스가 계속 진행되며이 스레드가 실행되는 동안 중지되지 않습니다. 3) 핫 루프를 사용하고 있습니다. 즉, Thread#sleep() 또는 다른 유형의 동등한 메소드를 호출하여 CPU를 사용 중지하고 완전히 중지하지 않아야합니다.

+0

좋아요, 그래서 저는 기본적으로 문을 열어두고 있습니다. 나는 새로운 개발자로서의 무지를 고백해야한다. 참조한 3 가지 사항에 대한 참조가 있습니까? 내가 그 활동을 어떻게 죽일지 잘 모르겠다. 솔직히이 문제가 그 지역에서 기인한다고 생각했기 때문에 내 직감은 이것이 문제라는 것입니다. – user571866

+0

좋아, 내 생각에 너의 제안이 의미 할 수있는 것을 찔러 보자. – user571866

+0

1) Thread.stop(); onPause 또는 onFinish에 있습니까? 2) 나는 이것에 익숙하지 않다. 그래서 스레드를 실행하기 전에 Thread.setDaemon (true)을 만들고 있습니까? 그게 그 과정인가? 3) 나는 sleep() 또는 stop()을 사용해야하는지 혼란 스럽다. 나는 실을 죽이고 싶지만, 어떻게 내게 그것을 함축합니까? 내 onPause에서 수면을 사용합니까? 시간 간격이 필요합니다. 일시 중지 된 전체 시간입니다. 이러한 개념을 올바르게 이해했는지에 대한 명확한 설명은 대단히 감사하겠습니다. 정말 고마워! – user571866

관련 문제