调试Android应用时出现InterruptedException异常

53

在 Android Studio 中进行调试时,某些情况下应用程序会崩溃,并显示以下异常:

08-27 18:01:25.144  19241-24656/? E/AndroidRuntime﹕ FATAL EXCEPTION: pool-7-thread-1
Process: com.callsign.android.dev, PID: 19241
java.lang.InterruptedException
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.reportInterruptAfterWait(AbstractQueuedSynchronizer.java:1991)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2025)
        at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:410)
        at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1035)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1097)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
        at java.lang.Thread.run(Thread.java:820)

这种情况发生在:

  • 只有在调试时
  • 只有在某些设备上(例如Moto G、Nexus 4)

例如,它不会发生在Oneplus One或Xperia L上。

我还没有找到其他信息来帮助我们确定问题。有人遇到过这个问题吗?


3
我目前在Genymotion模拟设备上也遇到了这个问题。不幸的是,我对这个问题没有任何见解。 - Brett Duncavage
我在三星手机上遇到了同样的问题。 - K.Sopheak
我不仅在调试时,而且在实际应用中也遇到了同样的问题。如果有人能帮忙,将不胜感激。 - Khizar Hayat
你停在断点处执行后,这个问题出现了吗? - Rahul
这可能会让人感到困惑,但是在调试时,请确保您没有任何变量句柄在调试控制台上。 - Franklin Hirata
4个回答

0
尝试使用异步任务或针对您的代码部分使用“AbstractQueuedSynchronizer”,看起来是同步问题。
public class Task extends AsyncTask<Void, Void, Void>
    {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        protected Void doInBackground(Void... paths) {
            //here your code (approx from line 400 to 850)
           return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
        }
    }

在按钮点击或任何其他方法中调用任务

new Task().execute();

0
  1. 检查您的代码库,特别是涉及多线程或后台任务的部分。注意使用线程的区域,并确保放置适当的同步机制,如锁定或信号量,以防止冲突。
  2. 分析调试过程中是否有任何可能引发问题的因素。有时,断点、监视器或复杂表达式的评估可能会导致意外后果,使应用程序在调试与正常执行时的行为不同。
我认为这些可能是问题的起因,请特别注意这些地方,有时候 build.gradle 的配置也可能导致问题,尤其是涉及某些库的情况。
编码愉快 :)

0

这可能对您有所帮助, 在 Thread::interrupt 方法处设置断点并捕获罪犯。更多信息,请参见 链接

或者分享一些详细的代码片段。具体取决于您的代码需求、您正在做什么以及如何实现。


0
public class Task extends AsyncTask<Void, Void, Void>
    {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        protected Void doInBackground(Void... paths) {
            //here your code (approx from line 400 to 850)
           return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接