我还是RxJava的新手,我在Android应用程序中使用它.我已经阅读了关于这个主题的公吨,但仍然觉得我错过了一些东西.
我有以下场景:
我有数据存储在系统中,可通过各种服务连接(AIDL)访问,我需要从该系统中检索数据(可能会发生1-n次异步调用).Rx帮助我简化了这段代码.但是,整个过程往往需要几秒钟(超过5秒+),因此我需要缓存此数据以加速本机应用程序.
此时的要求是:
初始订阅时,缓存将为空,因此我们必须等待所需的加载时间.没什么大不了.之后,应该缓存数据.
后续加载应该从缓存中提取数据,但是应该重新加载数据并且磁盘缓存应该在幕后.
问题:我有两个Observable - A和B. A包含从本地服务中提取数据的嵌套Observable(这里有吨).B更简单.B只包含从磁盘缓存中提取数据的代码.
需要解决:a)返回缓存项(如果已缓存)并继续重新加载磁盘缓存.b)缓存为空,从系统加载数据,缓存并返回.后续调用将返回"a".
我有几个人推荐一些操作,如flatmap,merge甚至主题,但由于某种原因,我无法连接点.
我怎样才能做到这一点?
我从互联网上找到了一个样本(https://github.com/manishkpr/Android-AIDL-Example)并在Android Studio上运行,它运行良好.
但是现在当我尝试重新创建项目时,无论我放在哪里,Android Studio都无法识别.aidl文件.任何人都可以告诉我在Android Studio中放置.aidl文件的正确位置是什么?
ps我已将以下代码添加到build.gradle并将.aidl文件放在java目录中,但未能使其正常工作.
sourceSets {
main {
aidl.srcDirs = ['src/main/java']
}
Run Code Online (Sandbox Code Playgroud) 这是第一个问题,但我已经有一段时间了.
我有什么:
我正在构建一个播放音频流和在线播放列表的Android应用.一切都工作正常,但我在与我的服务沟通时遇到问题.
音乐正在服务中播放,以startForeground开头,所以它不会被杀死.
我需要通过我的活动与服务进行沟通,以获取曲目名称,图像和更多内容.
我的问题是什么:
我想我需要使用bindService(而不是我当前的startService)启动我的服务,以便活动可以与它通信.
但是,当我这样做时,我的服务在关闭Activity后被杀死.
我怎样才能得到这两个?绑定和前台服务?
谢谢!
我写了一个在后台启动服务的库.它在所有应用程序中都运行良好
为了减少RAM的使用,我想避免为不同的应用程序运行多个服务.实际上,只使用一种服务来完成任务就足够了.
首先,我编写了一个AIDL文件,用于在应用程序/库之间建立IPC.使用签名权限将服务定义为导出/启用.由于所有应用程序都是完全相同的服务,因此无法检查是否有任何应用程序启动或关闭.绑定服务以检查服务的状态时,由于BIND_AUTO_CREATE标志的性质,它总是创建和销毁自己的服务.这就是为什么不能从导出的服务获得任何类型的信息,如果它真的启动并运行.
然后,我尝试将内容提供程序定义到库的清单中.我的目标是通过它分享服务信息.在导出的服务和应用程序主进程之间进行通信是非常好的机制.但它不适用于多个实例.因为从库中获取内容提供者信息的应用程序使用相同的权限,因此无法安装第二个.它给出了DUPLICATE_PROVIDER_AUTHORITY错误.
你对这个问题有什么建议?有没有选项来创建主/从机制?是否可以使应用程序的服务单例使用库项目?
PS:尝试过广播和共享偏好技术.但是他们无法从导出的服务中收听回调.
android aidl android-service android-contentprovider android-service-binding
我的appplication中的服务中有以下方法:
public void switchSpeaker(boolean speakerFlag){
if(speakerFlag){
audio_service.setSpeakerphoneOn(false);
}
else{
audio_service.setSpeakerphoneOn(true);
}
}
Run Code Online (Sandbox Code Playgroud)
所以我的问题是能够在如下的Activity中使用此方法的最佳和最有效的方法
final Button speaker_Button = (Button) findViewById(R.id.widget36);
speaker_Button.setOnClickListener(new View.OnClickListener(){
public void onClick(View v){
switchSpeaker(true); //method from Service
}
});
Run Code Online (Sandbox Code Playgroud)
我必须做AIDL还是有更简单的方法?
我的问题是从命令行使用aidl.exe(在Windows系统上).这个问题与Eclipse,Netbeans等无关.
Android SDK包含以下三个AIDL定义文件:
IRemoteService.aidl IRemoteServiceCallback.aidl ISecondary.aidl
位于以下目录中:
C:\ Android的SDK-WINDOWS \平台\ Android的2.1 \样本\ ApiDemos的\ src\COM \例子\机器人\的API \应用
为简单起见,我将aidl.exe复制到上面的目录中.然后,从控制台窗口,我成功使用以下两个命令来生成.java文件:
C:\ Android-project\ApiDemos\src\com\example\android\apis\app> aidl IRemoteServiceCallback.aidl C:\ Android-project\ApiDemos\src\com\example\android\apis\app> aidl ISecondary.aidl
调用这些命令分别生成文件IRemoteServiceCallback.java和ISecondary.java.到现在为止还挺好.
我注意到两个.aidl文件都很简单; 它们不包含"进口"声明.
剩余的.aidl文件IRemoteService.aidl在第19行包含以下import语句:
import com.example.android.apis.app.IRemoteServiceCallback;
当我在此文件上运行AIDL工具时出现问题:
C:\Android-project\ApiDemos\src\com\example\android\apis\app>aidl IRemoteService.aidl
Run Code Online (Sandbox Code Playgroud)
这样做会导致在控制台窗口中打印以下错误消息:
IRemoteService.aidl:19:找不到com.example.android.apis.app.IRemoteServiceCallback类的导入
AIDL工具显然无法在运行它的同一目录中找到IRemoteServiceCallback.aidl文件.根据AIDL工具的"用法"消息,有一个命令显然可以用来解决这个问题:
-I<DIR> search path for import statements.
Run Code Online (Sandbox Code Playgroud)
问题:我无法以避免错误消息的方式指定-I,并让AIDL工具从.aidl文件生成带有'import'语句的.java文件.(注意:我将Windows环境变量'path'设置为当前目录.)以下是我尝试过的一些变体:
-Ic:\com\example\android\apis\app
-Ic:/com/example/android/apis/app
-I.\
-I.
Run Code Online (Sandbox Code Playgroud)
我一定很遗憾.令人惊讶的是,即使我已经看到在各个地方发布的这个问题的变体,我还没有看到答案或任何有关AIDL命令行使用的文档(除了aidl.exe使用信息).有人能告诉我吗?
谢谢,马特
至今:
我找到了以下解决方案
广播接收器已从ICS弃用
这肯定会花费很多时间而且效率不高
这肯定会花费很多时间而且效率不高
即使根据网络连接不会花费太多时间,它也可能会有所不同
我的结论:
到目前为止,我发现的所有解决方案要么效率不高,要么不那么可靠.
我的问题:
如果VPN在Android设备中连接,那么android OS必须知道它.
是否有任何公共的android框架API来读取它,因为在本地查找是最有效和最可靠的解决方案?
有没有其他有效和可靠的方法来实现它(比如将C或C plus plus库与NDK集成)?
注意:
我也找不到OpenVPN for Android的任何自定义广播发件人/ AIDL
我正在尝试编译.aidl
和生成.java
但是:
Error:Execution failed for task ':library:compileReleaseAidl'.
> java.lang.RuntimeException: com.android.ide.common.process.ProcessException:
Error while executing 'C:\Users\Michele\AppData\Local\Android\sdk\build-tools\25.0.0\aidl.exe'
with arguments {-pC:\Users\Michele\AppData\Local\Android\sdk\platforms\android-25\framework.aidl
-oC:\Users\Michele\workspace\AndroidLib\library\build\generated\source\aidl\release
-IC:\Users\Michele\workspace\AndroidLib\library\src
-IC:\Users\Michele\workspace\AndroidLib\library\src\release\aidl
-IC:\Users\Michele\workspace\AndroidLib\library\build\intermediates\exploded-aar\com.android.support\appcompat-v7\25.0.1\aidl
-IC:\Users\Michele\workspace\AndroidLib\library\build\intermediates\exploded-aar\com.android.support\support-v4\25.0.1\aidl
-IC:\Users\Michele\workspace\AndroidLib\library\build\intermediates\exploded-aar\com.android.support\support-fragment\25.0.1\aidl
-IC:\Users\Michele\workspace\AndroidLib\library\build\intermediates\exploded-aar\com.android.support\support-media-compat\25.0.1\aidl
-IC:\Users\Michele\workspace\AndroidLib\library\build\intermediates\exploded-aar\com.android.support\support-core-ui\25.0.1\aidl
-IC:\Users\Michele\workspace\AndroidLib\library\build\intermediates\exploded-aar\com.android.support\support-core-utils\25.0.1\aidl
-IC:\Users\Michele\workspace\AndroidLib\library\build\intermediates\exploded-aar\com.android.support\animated-vector-drawable\25.0.1\aidl
-IC:\Users\Michele\workspace\AndroidLib\library\build\intermediates\exploded-aar\com.android.support\support-vector-drawable\25.0.1\aidl
-IC:\Users\Michele\workspace\AndroidLib\library\build\intermediates\exploded-aar\com.android.support\support-compat\25.0.1\aidl
-dC:\Users\Michele\AppData\Local\Temp\aidl3070615992051288022.d
C:\Users\Michele\workspace\AndroidLib\library\src\IRemoteShortcutService.aidl}
Run Code Online (Sandbox Code Playgroud)
我用这个 build.gradle
apply plugin: 'com.android.library'
apply plugin: 'com.github.dcendents.android-maven'
group='com.github.michelelacorte'
android {
compileSdkVersion 25
buildToolsVersion '25.0.0'
defaultConfig {
minSdkVersion 14
targetSdkVersion 25
versionCode 2
versionName "0.2.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
sourceSets {
main {
aidl.srcDirs = ['src/main/aidl']
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' …
Run Code Online (Sandbox Code Playgroud) aidl ×10
android ×9
java ×2
service ×2
android-ndk ×1
bind ×1
build.gradle ×1
caching ×1
foreground ×1
rx-java ×1
vpn ×1