当前位置: 首页 > 知识库问答 >
问题:

Thread.currentThread()。中断()在Android中不起作用[重复]

楚意
2023-03-14

< code>onIncomingCall()是来自第三方库< code>pjsip中的类的重写方法。当使用SIP进行传入呼叫时,调用此方法。不知何故,这个方法使得只有当呼叫应答代码在同一个方法中或者在同一个方法中被调用时,呼叫才有可能被应答。但是我希望当用户按下按钮时,电话被接听。我已经创建了一个回调函数,并让用户在呼叫到来时按下按钮,但是如果在< code>onIncomingCall()方法之外调用它,则呼叫应答代码不起作用。所以我决定将< code>Thread.sleep(10000)放在< code>onIncomingCall()中,当用户按下按钮时,我想取消这个线程,以便可以执行呼叫应答代码。

我使用了<code>Thread.currentThread()。中断()但是<code>线程。睡眠根本不会取消。我编写了一个单独的活动来测试这个功能,但它失败了,这意味着<code>Thread.currentThread。中断对我来说根本不起作用。实现这一目标的最佳选择是什么?请告诉我最新情况,我真的很挣扎。

@Override
public void onIncomingCall(OnIncomingCallParam prm) {

    onIncomingCallParam = prm;

    try  {
        Thread.sleep(10000);
    } catch(InterruptedException ie) {
        ie.printStackTrace();
    }

    answerCall();
}

更新:

我用以下方法修复了这个问题

resetThread();
while (testThread) {
    try {
        Log.d(TAG,"testThread true");
        Thread.sleep(1000);
    } catch (InterruptedException ie) {
        ie.printStackTrace();
    }

}

Log.d(TAG,"Call Answering code");


private void resetThread() {
        Thread newThread = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(10000);
                    testThread = false;
                } catch (InterruptedException ie) {
                    ie.printStackTrace();
                }
            }
        });
        try {
            newThread.start();
        } catch (Exception ie) {
            ie.printStackTrace();
        }
    }

共有2个答案

陆正奇
2023-03-14

也许所有调用都必须在创建库实例的同一线程上完成。尝试使用HandlerThread发布消息,并在自定义处理程序中处理这些消息,而不是挂起线程。

蒋俊人
2023-03-14

这里的问题与您没有中断正确的Thread有关,如果您调用Thread.currentThread()。中断(),您将中断当前线程而不是它当前正在睡觉的线程。

这里有一个清晰的例子来展示主要思想:

// Here is the thread that will only sleep until it will be interrupted
Thread t1 = new Thread(
    () -> {
        try {
            Thread.sleep(10_000L);
            System.err.println("The Thread has not been interrupted");
        } catch (InterruptedException e) {
            System.out.println("The Thread has been interrupted");
        }
    }
);
// Start the thread
t1.start();

// Make the current thread sleep for 1 sec
Thread.sleep(1_000L);
// Try to interrupt the sleeping thread with Thread.currentThread().interrupt()
System.out.println("Trying to call Thread.currentThread().interrupt()");
Thread.currentThread().interrupt();
// Reset the flag to be able to make the current thread sleep again
Thread.interrupted();

// Make the current thread sleep for 1 sec
Thread.sleep(1_000L);
// Try to interrupt the sleeping thread with t1.interrupt()
System.out.println("Trying to call t1.interrupt()");
t1.interrupt();

输出:

Trying to call Thread.currentThread().interrupt()
Trying to call t1.interrupt()
The Thread has been interrupted

正如您在输出中看到的,只有当我们调用 t1.interrupt() 时,线程才会中断,换句话说,只有当我们中断正确的 Thread 时,线程才会中断。

 类似资料:
  • 问题内容: 在下面的代码中不起作用: 在上面的代码中,我启动了一个检查对象是否不是的对象,并相应地取消了计时器。该对象由某些侦听器在任何时间设置。请参考并提出建议。我在这里做正确的事吗? Gautier Hayoun的解决方案 : 刚刚替代了CountDownTimer,可以从onTick内取消它:Github链接 – Gautier Hayoun 2010年12月12日,1:04 问题答案: G

  • 我的ad mob帐户已被限制,我在尝试加载广告时收到错误。 我读过调解网络应该仍然工作,即使广告暴民帐户已被限制,所以我试图添加到调解Facebook观众网络(FAN),但我有麻烦 我创建了一个facebook商业账户,喜欢按照这个官方指南AdMob:https://developers.google.com/admob/android/mediation/facebook#step_3_impo

  • 我正在使用演示APi(http://dummy.restapiexample.com/update) 我有一个响应类UpdateResponse 我有一个Api类和一个APIInterface 和对话框而不是主活动 在APIInterface中使用PUT方法有一个@path(id)和三个@fields(name、salary、age) 下面是UpdateResponse类代码 Api接口代码如下

  • 问题内容: 我正在尝试编写一个断言,以检查用户提供的大小是否为正值,如果不是,则使其为正,此语句位于类构造函数内部,该类构造函数采用大小值,然后生成array [size]。我写了下面的代码,我认为是正确的。 尽管我似乎从未评估过我的断言并继续执行程序,但会导致NegativeArraySize错误(我正在尝试避免) 我也尝试过 并且程序无法停止为负值。 我最近在Mac上运行Java时遇到了一些问

  • 问题内容: 谁能告诉我为什么在IE8中不起作用? 谢谢 问题答案: 如果我没记错的话,Internet Explorer8确实支持该样式,但是样式元素必须具有layout