开发者

Possible memory leak in android. Might be using the wrong cleanup method, or missing something

开发者 https://www.devze.com 2023-02-06 07:44 出处:网络
I have a memory leak. Here\'s the code package fourguys.testing.IntentTest; import android.app.A开发者_如何学Cctivity; import android.media.MediaPlayer; import android.os.Bundle; import android.os.

I have a memory leak. Here's the code

package fourguys.testing.IntentTest;

import android.app.A开发者_如何学Cctivity; 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();
    }

}

and this:

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

I run the app and it gets wonky on exit. It locks the handset and causes the battery to run hot. I need to pull the battery physically to reboot. Any thoughts as to why that might be? It runs fantastically on the emulator. Should I be using onFinish instead, or am I not cleaning something up and I'm missing it?


It is this part of your code:

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

You're doing three obvious things wrong here. 1) You're not killing it and/or pausing it in Activity#onPause. 2) You're not calling setDaemon(true); this will cause the process to continue and not die while this thread is running. 3) you're using a hot loop, i.e., you're not calling Thread#sleep() or some other type of equivalent method there to pause and stop fully using the cpu.

0

精彩评论

暂无评论...
验证码 换一张
取 消