Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/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
Java native interface 从本机方法在progressbar中显示值_Java Native Interface_Progress Bar_Android Ndk - Fatal编程技术网

Java native interface 从本机方法在progressbar中显示值

Java native interface 从本机方法在progressbar中显示值,java-native-interface,progress-bar,android-ndk,Java Native Interface,Progress Bar,Android Ndk,我有一些本机代码,希望从本机代码更新progressbar。没有返回值,因为这是一项持续时间较长的任务。 我找到了一个小例子,但是当我在一个额外的方法中移动更新部分时,我得到了一个NullPointerException。 似乎这部分必须在progressbar的螺纹中 我尝试了另一种方法,使用AsyncTask作为嵌套类,但我没有从类本身之外的任何地方访问方法publishProgress 有没有可能让它工作起来?如果有可能将您的长任务分解为多个增量调用,那么我建议您这样做。然后可以从Asyn

我有一些本机代码,希望从本机代码更新progressbar。没有返回值,因为这是一项持续时间较长的任务。
我找到了一个小例子,但是当我在一个额外的方法中移动更新部分时,我得到了一个NullPointerException。
似乎这部分必须在progressbar的螺纹中

我尝试了另一种方法,使用
AsyncTask
作为嵌套类,但我没有从类本身之外的任何地方访问方法
publishProgress


有没有可能让它工作起来?

如果有可能将您的长任务分解为多个增量调用,那么我建议您这样做。然后可以从AsyncTask.doInBackground()内的循环进行这些调用,就像SDK示例中一样


如果这是不可能的,您需要在本机代码中使用一个进度变量,该变量可以从多个线程安全地访问:使用本机代码中的done,从工作代码中写入进度变量,然后从新的“getProgress()”JNI函数中读取进度变量。然后,您可以从AsyncTask.doInBackground()或您选择使用的任何UI方案调用getProgress()函数。

如果可以将长任务分解为多个增量调用,我建议您这样做。然后可以从AsyncTask.doInBackground()内的循环进行这些调用,就像SDK示例中一样


如果这是不可能的,您需要在本机代码中使用一个进度变量,该变量可以从多个线程安全地访问:使用本机代码中的done,从工作代码中写入进度变量,然后从新的“getProgress()”JNI函数中读取进度变量。然后,您可以从AsyncTask.doInBackground()或您选择使用的任何UI方案调用getProgress()函数。

当任务运行时,doInBackground方法被阻止,不是吗?在第一种方案中,是的。在第二个场景中,在更新进度时只在工作线程中锁定互斥锁,在执行实际工作时解锁互斥锁,这样getProgress()就不会阻塞太多。您可能希望在getProgress()调用之间使用sleep()。哦,我误解了您。我试一试。啊,我想我可以看到混乱——在第二种方案中,您需要另一个工作线程(与异步任务线程分离)。您可能更喜欢从UI线程轮询getProgress()。是的,我在Java中启动了一个带有worker的线程,然后是AsyncTask。现在我试着把两者结合起来。我的工作者抛出异常,如果progressdialog能够做出反应,那就太好了。当任务运行时,doInBackground方法被阻止了,不是吗?在第一个场景中,是的。在第二个场景中,在更新进度时只在工作线程中锁定互斥锁,在执行实际工作时解锁互斥锁,这样getProgress()就不会阻塞太多。您可能希望在getProgress()调用之间使用sleep()。哦,我误解了您。我试一试。啊,我想我可以看到混乱——在第二种方案中,您需要另一个工作线程(与异步任务线程分离)。您可能更喜欢从UI线程轮询getProgress()。是的,我在Java中启动了一个带有worker的线程,然后是AsyncTask。现在我试着把两者结合起来。我的工作人员抛出异常,如果progressdialog能够做出反应,那就太好了。