小编Fre*_*red的帖子

kotlin中的Dagger 2静态提供程序方法

对于最近版本的匕首2,所做的改进之一是具有静态提供方法的可能性.简单地说:

@Provides
static A providesA() {
  return A();
}
Run Code Online (Sandbox Code Playgroud)

我想知道如何在kotlin做这件事?我试过了

@Module
class AModule {
  companion object {
    @JvmStatic
    @Provides
    fun providesA(): A = A()
  }
}
Run Code Online (Sandbox Code Playgroud)

但我收到错误消息:

@Provides methods can only be present within a @Module or @ProducerModule
Run Code Online (Sandbox Code Playgroud)

我猜这里有同伴对象,但是我对Kotlin很新,我不确定如何做到这一点.它甚至可能吗?

谢谢!

kotlin dagger-2

46
推荐指数
5
解决办法
8486
查看次数

有没有类似Single.empty()的东西

我正在从Rx 1迁移到Rx 2,突然在阅读帖子时我发现Single应该是用于改装调用的可观察类型.

所以我决定尝试一下,在将我们的改装调用迁移到Rx 2时,我也将返回值更改为Single<whatever>.

现在的问题是,我们的一些测试模拟网络服务类似于:

when(userService.logout()).thenReturn(Observable.empty())
Run Code Online (Sandbox Code Playgroud)

正如您在迁移调用之前所看到的那样,我们过去只是通过告诉userServicemock返回一个空的observable 来完成流.

在迁移到Single调用的"版本"时,我们不再使用,Observable.empty()因为调用不返回Observable,但返回a Single.

我最终做了类似的事情:

when(userService.logout()).thenReturn(
                    Single.fromObservable(Observable.<whatever>empty()))
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  1. 有没有更好的方法呢?
  2. 我错过了一些我应该知道的重要事情 - 这样的事情实际上并不像我期望的那样.

java rx-java rx-java2

19
推荐指数
2
解决办法
1万
查看次数

等价于约束布局 0dp

我一直在尝试使用 compose 实现以下布局:

在此处输入图片说明

为此,我创建了可组合的:

@Preview(showBackground = true)
@Composable
fun element() {
    ConstraintLayout(
        modifier = Modifier.fillMaxWidth()
    ) {
        val (checkbox, title, icon) = createRefs()

        Text(
            text = "This would be some text",
            style = TextStyle(
                color = Color.Black,
                fontSize = 18.sp,
            ),
            modifier = Modifier.constrainAs(title) {
                top.linkTo(parent.top)
                bottom.linkTo(parent.bottom)
                start.linkTo(checkbox.end)
                end.linkTo(icon.start)
            },
        )

        Checkbox(
            checked = false,
            modifier = Modifier.constrainAs(checkbox) {
                top.linkTo(title.top)
                bottom.linkTo(title.bottom)
                start.linkTo(parent.start)
            },
            onCheckedChange = {},
        )

        Icon(
            asset = Icons.Filled.Close,
            modifier = Modifier
                .constrainAs(icon) {
                    top.linkTo(title.top)
                    bottom.linkTo(title.bottom)
                    end.linkTo(parent.end)
                } …
Run Code Online (Sandbox Code Playgroud)

android android-jetpack-compose

10
推荐指数
1
解决办法
1011
查看次数

Git使用未命名的分支更新子模块

我已经使用git了很多但是远离了子模块,因为我没有充分的理由使用它们.但是,最近我开始了一个明显需要使用git这个功能的项目.

但是,每次克隆整个项目时,子模块都会以没有名称的分支结束.以下是我执行的命令:

git clone <url to project>
git submodule update --init <submodule>
cd <submodule>; git branch
Run Code Online (Sandbox Code Playgroud)

它打印出来:

* (no branch)
  master
Run Code Online (Sandbox Code Playgroud)

我需要做一些额外的事情

git checkout master
Run Code Online (Sandbox Code Playgroud)

现在我的问题是:这是标准行为吗?如果没有,你能帮助我理解我做错了什么吗?

谢谢

git

7
推荐指数
1
解决办法
967
查看次数

软键盘没有推动webview内容,也没有调整大小

简单地说,在webview中加载内容并点击文本字段后,我的应用程序拒绝调整大小或平移.

这是我的设置

我有一个包含多个片段的Activity.这是片段容器的布局.

 <android.support.v4.widget.DrawerLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"      
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent" 
    android:layout_height="match_parent">
    <!-- MAIN CONTENT -->
    <FrameLayout 
       android:id="@+id/container"
       android:layout_width="match_parent"
       android:layout_height="match_parent"   
       android:background="@android:color/white" />

    <RelativeLayout
       android:layout_width="240dp"
       android:layout_height="match_parent"
       android:layout_gravity="start">

       <!-- ... -->
    </RelativeLayout>
</android.support.v4.widget.DrawerLayout>
Run Code Online (Sandbox Code Playgroud)

这是webview片段的布局.

<RelativeLayout   
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <include
        android:id="@+id/tbOnlinePayment"
        layout="@layout/toolbar" />

    <WebView
        android:layout_below="@+id/tbOnlinePayment"
        android:id="@+id/paymentWebView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

    <ProgressBar
        android:id="@android:id/progress"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"/>

</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)

我的应用程序的主题延伸 Theme.AppCompat.Light.DarkActionBar

我尝试过的:

  • 就像它写在网络上我试过两个android:windowSoftInputMode="adjustResize"android:windowSoftInputMode="adjustPan".
  • 我知道全屏android:windowSoftInputMode="adjustResize"无法使用,但我不会手动强制执行此操作.我在这里放置应用程序的主题,因为也许有人知道这个主题以某种方式强制全屏.
  • 基于上面的假设我添加<item name="android:windowFullscreen">false</item>到应用程序的主题,但仍然没有结果.
  • 包装webview在一个scrollview.
  • webview高度改为wrap_content.
  • 基本上经历了大部分SO帖子和解决方案.

我想要的:

我不关心webview是调整大小还是推高.我想要的是键盘不隐藏输入字段.

android

5
推荐指数
1
解决办法
1270
查看次数

如何使用rabbitmq路由功能知道消息是否已发布到队列

我一直在研究一个使用rabbitmq进行交流的项目.最近我们发现,如果我们使用兔子路由功能,它将具有很大的可扩展性.所以基本上我们将队列绑定到几个路由键并使用类型的交换direct.

它像发布/订阅一样工作.因此,可以将队列绑定和解除绑定到不同的事件,以便消费者/订阅者只接收他们感兴趣的消息.

当然,生产者/发布者现在使用绑定密钥(事件名称)将routing_key其传递给pika实现.但是,当它为不存在的绑定发布某些内容时,该消息将丢失,即当没有人绑定事件队列foo但是某些发布者调用时pika.basic_publish(..., routing_key='foo').

所以我的问题是:

是否可以知道消息是否实际发布在队列中?

我尝试过的:

  • 检查pika.basic_publish的返回值.它总是回归None.

  • 当我们尝试发布不存在的绑定时,请检查是否存在异常.空无一人.

  • 有一个额外的队列来进行带外控制(因为所有订户都由同一个进程运行).这种方法就像用火箭筒杀死苍蝇一样,我拒绝保留它.而且,我认为我应该为了实际尝试而拍摄自己.

附加信息

  • 由于我正在使用此路由功能,因此队列名称由rabbit生成.如果新方法必须命名队列本身,我没有任何问题.

  • 如果建议一种新的方法需要绑定到交换而不是队列,我想听听它们,但我宁愿避免使用它们,因为它们实际上不是AMQP,而是由rabbitmq实现的扩展.

  • 鼠兔版是0.9.5

  • rabbitmq版本是2.8

非常感谢

python rabbitmq pika

4
推荐指数
1
解决办法
2852
查看次数

删除字节时的 SHA 冲突概率

我正在实现一些使用可变长度 id 的程序。这些 ID 标识一条消息并发送到将执行某些操作(与问题无关)的代理。但是,代理中此 id 的最大长度为 24 字节。我正在考虑使用 SHA 对 id 进行哈希处理(在发送到代理之前)并删除一些字节,直到它仅获得 24 个字节。

但是,我想知道这会增加多少碰撞。这就是我到现在为止得到的:

我发现对于“完美”哈希,我们有p^2 / 2^n+1描述冲突概率的公式,其中p是消息数量,n是消息大小(以位为单位)。这就是我的问题开始的地方。我假设从最终哈希中删除一些字节该函数仍然保持“完美”,并且我仍然可以使用相同的公式。所以假设我得到:

 5160^2 / 2^192 + 1 = 2.12x10^-51
Run Code Online (Sandbox Code Playgroud)

其中 5160 是消息的选择数,192 基本上是 24 字节中的位数。

我的问题:

  • 我的假设正确吗?通过删除一些字节,哈希是否保持“完美”。

  • 如果是这样,并且由于概率非常小,我应该删除哪些字节?最重要还是最不重要?这真的很重要吗?

PS:欢迎任何其他建议来达到相同的结果。谢谢。

hash cryptography sha

3
推荐指数
1
解决办法
1204
查看次数

验证rxjava订阅者中的交互

在MVP模式中描绘您的演示者订阅返回观察者的服务的情况:

public void gatherData(){
   service.doSomeMagic()
      .observeOn(Schedulers.io())
      .subscribeOn(AndroidSchedulers.mainThread())
      .subscribe(new TheSubscriber());
}
Run Code Online (Sandbox Code Playgroud)

现在该类从视图中TheSubscriber调用onNext一个方法,例如:

@Override public void onNext(ReturnValue value) {
  view.displayWhatever(value);
}
Run Code Online (Sandbox Code Playgroud)

现在,在我的单元测试中,我想验证当在gatherData()非错误情况下调用该方法时,将调用视图的方法displayWhatever(value).

问题:

有干净的方法吗?

背景:

  • 我正在使用mockito验证交互,当然还有更多
  • Dagger正在注射整个主持人,除了 TheSubscriber

我试过了什么:

  • 注入订阅者并在测试中模拟它.看起来有点脏,因为如果我想改变演示者与服务交互的方式(说不是Rx),那么我需要改变很多测试和代码.
  • 模拟整个服务.这不是那么糟糕,但要求我嘲笑很多方法而且我没有完全达到我想要的.
  • 在互联网上查找,但没有人似乎有一个干净的直接方式这样做

谢谢您的帮助

android mockito rx-java

3
推荐指数
1
解决办法
1987
查看次数

如何使用AndroidInjector在模块内部获取MainActivity

随着dagger-android一个现在可以简单地写上如下,并成功注入应用程序的依赖关系:

@Module
public abstract class MainActivityModule {
  @ContributesAndroidInjector
  abstract MainActivity contributesMainActivity();
}

@Singleton
@Component(modules = {
    AndroidSupportInjectionModule.class,
    AndroidInjectionModule.class,
    AppModule.class,
    MainActivityModule.class
})
public interface ApplicationComponent {
  void inject(BaseApplication baseApplication);

  @Component.Builder
  interface Builder {
    @BindsInstance
    Builder application(Application application);

    ApplicationComponent build();
  }
}

@Module
public abstract class AppModule {}

public class MainActivity extends AppCompatActivity implements 
  HasSupportFragmentInjector {
  @Inject
  DispatchingAndroidInjector<Fragment> dispatchingAndroidInjector;
  @Inject
  Whatever whatever;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    AndroidInjection.inject(this);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
  }

  @Override
  public AndroidInjector<Fragment> supportFragmentInjector() {
    return dispatchingAndroidInjector;
  } …
Run Code Online (Sandbox Code Playgroud)

android dagger dagger-2

3
推荐指数
1
解决办法
629
查看次数

递增空指针

可能重复:
void*算术

嗨伙计们,我有一个关于C中指针增量的小问题.首先我要知道,指针将ptr++在哪里ptr增加sizeof(*ptr).我也知道*ptr,在编写时,编译器知道它必须sizeof(*ptr)从内存中获取字节.

第二部分帮助我理解为什么以下甚至不编译:

int main(){
 int a = 3;
 void* b = &a;
 printf("%d\n", *b);
 return 0;
}
Run Code Online (Sandbox Code Playgroud)

因为编译器不知道类型变量的大小void.但是,我对以下代码有点困惑:

int main(){
 int a = 3;
 void* b = &a;
 printf("%p\n", b);
 b++;
 printf("%p\n", b);
}
Run Code Online (Sandbox Code Playgroud)

所以,我的两个问题是:

  1. 编译器如何知道它应该增加b多少?

  2. 为什么它只增加一个字节(至少在我的机器中是一个字节)?

c

0
推荐指数
1
解决办法
3319
查看次数