我正在我的库中实现一个名为HttpDataStream
的C ++类。我必须进行JNI绑定才能在Android下使用我的库,使用iOS的Objective-C绑定。
我需要在Java和Objective-C中创建一个专用的HttpDataStream
类,但我想知道这些类是否会在下载完成之前实际阻止整个应用程序。
例如,让我们从“Android端”的read
课程中调用HttpDataStream
方法:
std::streamsize DataStreamJava::read(double value) {
jmethodID m = jni->GetMethodID(j_dataStream_class_,
"read", "(D)J");
jni->CallLongMethod(j_dataStream_global_, m);
return 0;
}
假设read
方法将下载文件并返回下载的字节数。我目前正在考虑,即使我在“Android端”使用Threads和Runnables,C ++库实际上会阻塞,直到下载完成。
所以我问自己以下问题:
答案 0 :(得分:1)
如果这是一个更长的下载操作,那么在Android下,建议从线程内部(可能是前台)服务进行。这样一旦用户隐藏它,系统就不会杀死你的应用程序。在这个场景中,最好在java端创建线程。
在我正在处理的应用程序中,我有许多本机代码,它们在自己的本机线程中执行。此代码通过调用java类上的方法来进行HTTP通信 - 这包含各种android HTTPClient方法。这些数据主要是少量的。
所以:
是否应该在C ++和Java端实现多线程?
对于少量数据我会在C ++代码中进行线程化并调用包装HTTPClient或URL的java类。你可以使用这个pthreads,它应该适用于android和ios几乎没有变化。
对于大量数据,至少在android下 - 使用服务中的java线程。这实际上很难对像c ++中的read这样的操作进行编码。
我不确定流式数据,我理解是你的情况,如果你需要立即数据 - 那么原生线程应该是最好的。
答案 1 :(得分:1)
答案取决于您对多线程的期望:
a)在一方流水线化相关行动
如果Java端的read()
执行多个依赖操作,例如读取,解释或预处理数据,并最终渲染数据,则可以考虑在java端执行多线程处理。
但是你在那边做,你对流类'read()
的单次调用只有在java端的所有mutlithreaded动作完成时才会返回。所以是的,在这种情况下,C ++代码被卡住了,等待返回。
b)做一些无关的事情
因此,如果您希望C ++代码在读取数据时执行其他操作,但与获取的数据无关,则应考虑在C ++端执行多线程处理(不要忘记将JNI环境附加到新线程!)。
c)管道双方的相关行动
但是如果你必须通过Java处理C ++方面的某些部分获取数据(例如,开始显示数据),那么你可以选择以下两种方法之一:
java或C ++中的obsrever
这取决于您选择和与先前选择相关的约束。如果不了解更多信息,很难为您提供客观有用的建议。