我已经定义了这种Android Java类,其中本机函数baresipStart()
永远不会终止:
package com.tutpro.baresip;
public class BaresipThread extends Thread {
public void start() {
baresipStart();
}
public void kill() {
baresipStop();
}
public native void baresipStart();
public native void baresipStop();
}
然后我从另一个Java类调用它的start()
函数:
BaresipThread thread;
thread = new BaresipThread();
thread.start();
结果是baresipStart()
函数开始运行正常,但应用程序的其余部分变得完全没有响应。
为什么这样以及如何修复代码以便baresipStart()
函数在后台运行而不停止所有其他活动?
答案 0 :(得分:1)
Thread.start()
负责实际创建新的执行线程并将其设置为运行。通过像你一样覆盖它,你可以在调用baresipStart()
的线程中运行start()
,。
您应该覆盖start()
,而不是覆盖run()
。此方法定义了在新的执行线程中执行的工作。
此外,如果本机方法baresipStart()
确实从不返回,那么您就遇到了问题。您的应用程序在有任何活动线程时无法终止。假设您打算让baresipStop()
导致线程完成,那么当调用baresipStart()
终止执行时,应安排baresipStop()
返回(或抛出未经检查的异常)。但请注意,这些本机方法需要是线程安全的,因为它们将由不同的Java线程调用。
答案 1 :(得分:0)
感谢您的解释。我通过完全删除BaresipThread对象并用以下内容替换上面的三行来启动新的baresip线程:
new Thread(new Runnable() {
public void run() {
baresipStart();
}
}).start();
用户可以通过其用户界面停止生成的进程,然后终止应用程序。