简体   繁体   English

使用wakelock.release()关闭应用程序时Android应用程序崩溃

[英]Android app crashed when closing app using wakelock.release()

I have a simple flash light app that works well but when the user closes the app the app crashes. 我有一个简单的闪光灯应用程序运行良好,但当用户关闭应用程序时,应用程序崩溃。 I presume the problem is with the wakelock. 我认为问题出在唤醒锁上。

When the flash is on the the wakelock is turned on, when the flash is turned off the wakelock is turned off. 当闪光灯打开时,唤醒锁被打开,当闪光灯关闭时,唤醒锁被关闭。 This works fine but as soon as the user presses back or home the app crashes. 这工作正常,但一旦用户按下或回家应用程序崩溃。

My Log data: 我的日志数据:

10-24 09:52:45.235: E/AndroidRuntime(6614): Process: r1d.org.uk.flashlight, PID: 6614 10-24 09:52:45.235: E/AndroidRuntime(6614): java.lang.RuntimeException: Unable to destroy activity {r1d.org.uk.flashlight/r1d.org.uk.flashlight.MainActivity}: java.lang.RuntimeException: WakeLock under-locked MyWakelockTag 10-24 09:52:45.235: E/AndroidRuntime(6614): at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3812) 10-24 09:52:45.235:E / AndroidRuntime(6614):进程:r1d.org.uk.flashlight,PID:6614 10-24 09:52:45.235:E / AndroidRuntime(6614):java.lang.RuntimeException :无法销毁活动{r1d.org.uk.flashlight / r1d.org.uk.flashlight.MainActivity}:java.lang.RuntimeException:WakeLock欠锁MyWakelockTag 10-24 09:52:45.235:E / AndroidRuntime(6614) ):在android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3812)

MainActivity: 主要活动:

public class MainActivity extends Activity {

    private ImageView lightToggle;
    private ImageButton lightSwitch;
    Camera camera = null;
    Parameters parameters;
    Boolean isOn = false;
    int lightON = R.drawable.on;
    int lightOFF = R.drawable.off;
    int switchON = R.drawable.switch_on;
    int switchOFF = R.drawable.switch_off;
    Boolean hasFlash;
    PowerManager powerManager;
    PowerManager.WakeLock wakeLock;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        AdManager ads = new AdManager(this);
        lightToggle = (ImageView) findViewById(R.id.lightOn);
        lightSwitch = (ImageButton) findViewById(R.id.lightSwitch);
        Context context = this;
        hasFlash = context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);
        powerManager = (PowerManager) getSystemService(POWER_SERVICE);
        wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakelockTag");

        if(!hasFlash){
            ContextThemeWrapper themedContext;
            if ( Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB ) {
                themedContext = new ContextThemeWrapper( MainActivity.this, android.R.style.Theme_Holo_Light_Dialog_NoActionBar );
            }
            else {
                themedContext = new ContextThemeWrapper( MainActivity.this, android.R.style.Theme_Light_NoTitleBar );
            }
            AlertDialog.Builder builder = new AlertDialog.Builder(themedContext);
            builder.setTitle(getResources().getString(R.string.notsupported))
                    .setMessage(getResources().getString(R.string.notsupportedinfo))
                    .setIcon(android.R.drawable.ic_dialog_alert)
                    .setNegativeButton(getResources().getString(R.string.ok), new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int i) {
                            dialog.cancel();
                        }
                    });
            builder.show();
        }
        turnOn();
        lightSwitch.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(isOn){
                    turnOff();
                } else {
                    turnOn();
                }
            }
        });
    }
    private void turnOn(){
        lightToggle.setImageDrawable(getResources().getDrawable(lightON));
        lightSwitch.setImageDrawable(getResources().getDrawable(switchON));
        wakeLock.acquire();
        if(hasFlash) {
            camera = Camera.open();
            parameters = camera.getParameters();
            parameters.setFlashMode(Parameters.FLASH_MODE_TORCH); //FLASH_MODE_ON
            camera.setParameters(parameters);
        }
        isOn = true;
    }
    private void turnOff(){
        lightToggle.setImageDrawable(getResources().getDrawable(lightOFF));
        lightSwitch.setImageDrawable(getResources().getDrawable(switchOFF));
        wakeLock.release();
        if(hasFlash) {
            parameters.setFlashMode(Parameters.FLASH_MODE_OFF);
            camera.setParameters(parameters);
            camera.release();
            camera = null;
        }
        isOn = false;
    }
    @Override
    public void onDestroy() {
        turnOff();
        super.onDestroy();
    }
    @Override
    public void onPause(){
        turnOff();
        super.onPause();
    }
    @Override
    public void onResume(){
        turnOn();
        super.onResume();
    }
}

In onDestroy you're trying to release a wakelock which you already released in onPause . onDestroy你试图发布一个已经在onPause发布的唤醒锁。 This should work: 这应该工作:

if (wakeLock.isHeld()) {
    wakeLock.release();
}

当 object 添加到 ArrayList 时,Android 应用程序崩溃<object><div id="text_translate"><p>我是新手,因此对任何错误表示歉意。</p><p> 背景:作为 object 培训的一部分,我正在尝试添加 object 练习的 arraylist。 然而。 每次我尝试将 object 练习添加到训练的 Arraylist 时,应用程序都会崩溃。 欢迎任何帮助。</p><p> 对象训练和锻炼看起来像这样</p><pre>public class Training { public Integer trainingNumber; public Date datum; public Integer nrOfExercises; public ArrayList&lt;Exercise&gt; exercises; } public class Training { public Integer trainingNumber; public Date datum; public Integer nrOfExercises; public ArrayList&lt;Exercise&gt; exercises; }</pre><p> 试图生成所有这些的代码如下:</p><pre> private Training createRandomTraining(int i){ Training randomTraining = new Training(); Random random = new Random(); int d = random.nextInt(30)+1; int m = random.nextInt(12)+1; //int y = random.nextInt(21)+2000; int amountOfExercises = random.nextInt(9-6)+6; randomTraining.trainingNumber = i; randomTraining.datum = new Date(2021,m,d); for (int j = 0; j &lt; amountOfExercises; j ++){ Exercise exercise = new Exercise(); Random r = new Random(); int set = r.nextInt(5)+1; int nameInt = r.nextInt(3); int rep = r.nextInt(12)+1; //int y = random.nextInt(21)+2000; exercise.trainingNumber = i; exercise.exerciseNumber = j+1; exercise.exerciseName = getExerciseName(nameInt); exercise.sets = set; exercise.reps = rep; exercise.weight = random.nextInt(200-50)+50; randomTraining.exercises.add(exercise); //the app crashes here. //The other parts work fine. } randomTraining.nrOfExercises = amountOfExercises; return randomTraining; }</pre></div></object> - Android app crashed when object is added to ArrayList<Object>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 当我尝试打开它时,Android 应用程序崩溃了 - Android App crashed when i try to open it Android 应用程序在更改方向时崩溃 - Android app crashed when change orientation Android应用程序在setContentView上崩溃 - Android app Crashed on setContentView 不幸的是,使用安卓手机启动应用程序时应用程序崩溃 - Unfortunately App has been crashed when using android phone to launch the app Android教程(第一个)应用程序崩溃 - Android tutorial (first) app crashed 设置ListAdapter时Android Java App崩溃 - Android Java App crashed when setting up ListAdapter 当 object 添加到 ArrayList 时,Android 应用程序崩溃<object><div id="text_translate"><p>我是新手,因此对任何错误表示歉意。</p><p> 背景:作为 object 培训的一部分,我正在尝试添加 object 练习的 arraylist。 然而。 每次我尝试将 object 练习添加到训练的 Arraylist 时,应用程序都会崩溃。 欢迎任何帮助。</p><p> 对象训练和锻炼看起来像这样</p><pre>public class Training { public Integer trainingNumber; public Date datum; public Integer nrOfExercises; public ArrayList&lt;Exercise&gt; exercises; } public class Training { public Integer trainingNumber; public Date datum; public Integer nrOfExercises; public ArrayList&lt;Exercise&gt; exercises; }</pre><p> 试图生成所有这些的代码如下:</p><pre> private Training createRandomTraining(int i){ Training randomTraining = new Training(); Random random = new Random(); int d = random.nextInt(30)+1; int m = random.nextInt(12)+1; //int y = random.nextInt(21)+2000; int amountOfExercises = random.nextInt(9-6)+6; randomTraining.trainingNumber = i; randomTraining.datum = new Date(2021,m,d); for (int j = 0; j &lt; amountOfExercises; j ++){ Exercise exercise = new Exercise(); Random r = new Random(); int set = r.nextInt(5)+1; int nameInt = r.nextInt(3); int rep = r.nextInt(12)+1; //int y = random.nextInt(21)+2000; exercise.trainingNumber = i; exercise.exerciseNumber = j+1; exercise.exerciseName = getExerciseName(nameInt); exercise.sets = set; exercise.reps = rep; exercise.weight = random.nextInt(200-50)+50; randomTraining.exercises.add(exercise); //the app crashes here. //The other parts work fine. } randomTraining.nrOfExercises = amountOfExercises; return randomTraining; }</pre></div></object> - Android app crashed when object is added to ArrayList<Object> 单击“返回”时Android应用程序未正确关闭 - Android App Not Closing Properly When Clicking Back 定义Uri Android时应用关闭 - App closing when defining a Uri Android 在 android 上安装数据库期间,将 AsyncTask 与 Sqlite 一起使用会导致应用程序崩溃? - Using AsyncTask with Sqlite crashed app during database installation on android?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM