我试图构建一个包含La带有proguard 的库模块的应用程序,我注意到该库没有被混淆.试图理解为什么.在这个时刻,这是我的buildType:
release {
minifyEnabled false
useProguard true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
Run Code Online (Sandbox Code Playgroud)
经过一些搜索后,我遇到了ConsumerProguardFiles函数,该函数指出:
ProGuard规则文件将包含在已发布的AAR中.
然后,任何使用AAR的应用程序项目都会使用这些proguard规则文件(如果启用了ProGuard).
这允许AAR指定收缩或混淆排除规则.
这仅适用于Library项目.这在Application项目中被忽略.
现在buildType,我的库La中有以下内容:
release {
minifyEnabled false
useProguard true
consumerProguardFiles 'proguard-rules.pro'
}
Run Code Online (Sandbox Code Playgroud)
现在我的库La正在使用它的proguard规则,库代码被混淆了.
所以我的问题是:
1)这种不同行为的原因是什么.为什么ProguardFiles不会混淆库的规则,而是忽略它?
2)我猜测ConsumerProguardFiles所做的是将库的规则与主应用程序proguard规则合并.这个假设是否正确?
3)简而言之:对应用程序使用proguardFiles,对库使用ConsumerProguardFiles.正确?
感谢您抽出宝贵的时间阅读!
我一直试图在ViewUtils类中注入Activity,但没有成功.我已经关注了几个不同的帖子,但我似乎无法理解我在实现中缺少的内容.
我知道这可能是下面帖子的重复,我真的为此道歉但老实说我看不出我错过了什么.这些是我发现的帖子:
我的实现如下:
AppComponent
@Component(modules = {
AppModule.class, AndroidSupportInjectionModule.class, ActivityBindingModule.class
}) @Singleton public interface AppComponent extends AndroidInjector<EmblyApp> {
@Component.Builder abstract class Builder extends AndroidInjector.Builder<EmblyApp> {}
}
Run Code Online (Sandbox Code Playgroud)
ActivityBindingModule
@Module public abstract class ActivityBindingModule {
@ContributesAndroidInjector
abstract LoginActivity loginActivity();
}
Run Code Online (Sandbox Code Playgroud)
LoginSubcomponent
@Subcomponent(modules = LoginSubcomponent.LoginActivityModule.class)
public interface LoginSubcomponent extends AndroidInjector<LoginActivity> {
@Subcomponent.Builder abstract class Builder extends AndroidInjector.Builder<LoginActivity> {}
@Module abstract class LoginActivityModule {
@Binds abstract Activity bindActivity(LoginActivity activity);
@Provides @ActivityScope static ViewUtils viewUtils(Activity activity) {
return new …Run Code Online (Sandbox Code Playgroud) 我试图以一种被动的方式理解同一个observable的同时操作应该如何工作.
方案如下:
我有一个用户列表和一个删除按钮.每当我按下remove我正在调用API时:UsersApi.removeUser.可以同时删除多个用户.这意味着多个UsersApi.removeUser同时发生.
每次之后UsersApi.removeUser我都需要打个UsersApi.refreshUser电话
所以就伪代码而言,点击删除时我正在做的事情如下:
主持人:
public Observable<User> removeUser(int userId) {
return UsersApi.removeUser(userId)
.flatMap(user -> UsersApi.refreshUser(userId));
}
Run Code Online (Sandbox Code Playgroud)
分段:
public void removeUser() {
presenter.removeUser(userId)
.subscribe(user -> {
//remove user from ui
// update number of total users
})
}
Run Code Online (Sandbox Code Playgroud)
这种方法的问题在于,由于remove的异步性质(允许多次删除),我无法保证到达订阅的内容是最新的.订阅将达到两次,每次删除一次,用户信息可能不会更新或最新.那有意义吗?
我想要发生什么:
编辑:我想知道的是如何做/如果可以使用Rx运算符做我做的解决方案(参见edit2).
Edit2:我的解决方案是将用户操作(在这种情况下remove)排入队列,并在UsersApi.refreshUser(userId)调用完成时使用PublishSubject发出.
基本上我所做的是(伪代码):
private final PublishSubject<UserOperation> userOperationObs;
private final ConcurrentLinkedQueue<UserOperation> pendingOperations;
private boolean executingOperation;
private void emitUserOperation(final UserOperation operation) {
if (!executingOperation) {
executingOperation …Run Code Online (Sandbox Code Playgroud) 所以我想要做的是一个固定的侧边栏,顶部有一个固定的菜单,中间的内容可以滚动。
body,
html {
height: 100%;
margin: 0;
}
aside {
background: #90EE90;
height: 100%;
left: 0;
position: fixed;
top: 0;
width: 120px;
}
ul {
list-style: none;
}
section {
background: #ADD8E6;
height: 100%;
margin-top: 60px;
}
header {
background: #FF0;
height: 60px;
left: 0;
margin-left: 120px;
position: fixed;
text-align: center;
top: 0;
width: 100%;
z-index: 99;
}
.container {
left: 0;
margin-left: 120px;
min-height: 100%;
position: relative;
text-align: center;
}
figure {
margin: 0;
}
img {
height: …Run Code Online (Sandbox Code Playgroud)