Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
android中可能存在内存泄漏。可能是使用了错误的清理方法,或者遗漏了某些内容_Android - Fatal编程技术网

android中可能存在内存泄漏。可能是使用了错误的清理方法,或者遗漏了某些内容

android中可能存在内存泄漏。可能是使用了错误的清理方法,或者遗漏了某些内容,android,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.A

我的内存泄漏了。这是密码

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

你在这里犯了三个明显的错误。1) 您没有在
活动#onPause
中终止和/或暂停它。2) 你没有打电话;这将导致进程继续,而不会在该线程运行时消亡。3) 您使用的是热循环,即,您没有调用
线程#sleep()
或其他类型的等效方法来暂停并完全停止使用cpu

代码查看器的行为很奇怪,对不起。好吧,我基本上是开着门。作为一个新开发人员,我必须承认我的无知。你有关于你提到的3件事的参考资料吗?我不知道我该如何停止或清理这些活动。老实说,我确实希望这个问题来自于这个领域,所以我的直觉反应是这就是问题所在。好吧,让我来尝试一下我认为你的建议可能意味着什么:1)我需要像线一样做。停止();在onPause或onFinish中?2) 我不熟悉这个。那么,我是在线程开始运行之前创建Thread.setDaemon(true)的吗?这就是过程吗?3) 我不知道是应该使用sleep()还是stop()。我想终止线程,但我如何实现它?我在暂停时使用睡眠吗?这似乎需要一段时间间隔,也就是暂停的整个时间。如能澄清我是否正确理解这些概念,我将不胜感激。非常感谢!