小编Ogn*_*yan的帖子

Java依赖注入:Dagger 1 vs Dagger 2,哪个更好?

Dagger 2Dagger 1有什么优势?

到目前为止我发现(只)2:

  • Dagger 2允许您使用proguard进行代码混淆
  • Dagger 2更快(这对于Android应用程序使用时没有多大优势,但如果你将它用于某种服务器,这肯定是一件很重要的事情)

与此同时,我发现了一个很大的缺点:你不能@Module(overrides = true)在Dagger 2中使用模块覆盖(),这至少对我来说很烦人 - 它对于单元测试非常有用.

还有其他优点/缺点吗?

java android dependency-injection dagger dagger-2

22
推荐指数
1
解决办法
7351
查看次数

匕首2:何时使用构造注射以及何时使用注射?

我有点懒惰,习惯几乎完全用场注射.我只是提供空构造函数,把我的@Inject字段我看起来很好很简单.然而,现场注入有其权衡,所以我设计了一些简单的规则,帮助我决定何时使用字段以及何时使用构造函数注入.如果我的逻辑中存在错误或者您需要添加其他注意事项,我将不胜感激.

首先澄清一下,以便在同一页面上:

构造函数注入:

@Inject
public SomeClass(@Named("app version") String appVersion,
                    AppPrefs appPrefs) {...
Run Code Online (Sandbox Code Playgroud)

与现场注入相同:

public class SomeClass {
    @Inject
    @Named("app version") String mAppVersion;

    @Inject
    AppPrefs appPrefs;
Run Code Online (Sandbox Code Playgroud)

规则1:如果我不控制对象的创建,则必须使用字段注入(想想Android中的Activity或Fragment).如果某个(非匕首意识)框架正在创建我的对象并将其处理给我,我别无选择,只能在收到实例后手动注入它.

规则2:如果该类是/可能在另一个不使用Dagger 2的项目中使用,则必须使用构造函数注入.如果其他项目不使用Dagger,则他们不能使用DI,因此用户必须使用"旧"方式创建对象new.

规则3:使用类层次结构时PREFER构造函数注入,因为它更容易创建单元测试.

澄清:

考虑以下使用现场注入的结构:

package superclass;

public class SuperClass {
    @Inject
    HttpClient mHttpClient;
    ...
}
Run Code Online (Sandbox Code Playgroud)

.

package differentpackage;

public class SubClass extends SuperClass {
    public SubClass() {
    }
}
Run Code Online (Sandbox Code Playgroud)

当我SubClass在目录中创建单元测试时,test/java/differentpackage我别无选择,只能启动整个DI基础设施,以便能够注入HttpClient.相反,如果我像这样使用构造函数注入:

public class SuperClass {
    private final HttpClient mHttpClient;

    @Inject
    public SuperClass(HttpClient httpClient) { …
Run Code Online (Sandbox Code Playgroud)

java dependency-injection dagger-2

22
推荐指数
1
解决办法
3199
查看次数

这是在单元测试中使用Dagger 2 for Android app的正确方法来覆盖与模拟/假货的依赖关系吗?

对于"常规"Java项目来说,使用模拟/伪造的方法覆盖单元测试中的依赖项很容易.您必须简单地构建Dagger组件并将其提供给驱动应用程序的"main"类.

对于Android而言,事情并不那么简单,我已经搜索了很长时间才能找到合适的例子,但是我无法找到,所以我必须创建自己的实现,我真的很感激反馈这是使用Dagger 2或者那里的正确方法是一种更简单/更优雅的方式来覆盖依赖项.

这里的解释(项目源可以在github上找到):

鉴于我们有一个简单的应用程序使用Dagger 2与单个模块的单个匕首组件我们想要创建使用JUnit4,MockitoEspresso的 Android单元测试:

MyApp Application类中,组件/注入器初始化如下:

public class MyApp extends Application {
    private MyDaggerComponent mInjector;

    public void onCreate() {
        super.onCreate();
        initInjector();
    }

    protected void initInjector() {
        mInjector = DaggerMyDaggerComponent.builder().httpModule(new HttpModule(new OkHttpClient())).build();

        onInjectorInitialized(mInjector);
    }

    private void onInjectorInitialized(MyDaggerComponent inj) {
        inj.inject(this);
    }

    public void externalInjectorInitialization(MyDaggerComponent injector) {
        mInjector = injector;

        onInjectorInitialized(injector);
    }

    ...
Run Code Online (Sandbox Code Playgroud)

在上面的代码中:正常的应用程序启动通过onCreate()哪些调用initInjector()创建注入器然后调用onInjectorInitialized().

externalInjectorInitialization()方法可以通过单元测试来调用,以便set从外部源进行注入,即单元测试.

到现在为止还挺好.

让我们看看单元测试方面的内容如何: …

android unit-testing dagger-2

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

在Gradle构建之后,Intellij Idea不会在消息工具窗口中显示错误

Intellij Idea 14.1.2,Gradle 2.3

我有一个项目,几个java子项目.Gradle构建按预期工作,但Intellij Idea不捕获它的输出,也不显示消息工具窗口,您可以在其中单击错误并转到源文件.

重现步骤:

  1. 创建新的gradle项目
  2. 使用一种方法创建新类
  3. 故意介绍一个错误
  4. 使用Gradle工具窗口构建

预期结果:消息工具窗口将显示错误.

实际结果:输出显示在"运行"工具窗口中,但未显示"消息"窗口(它的菜单项在"视图" - >"工具"窗口中甚至不活动)

我试图重新导入项目,从头开始创建它,搜索Idea的设置,在*.iml中手动操作值,但没有成功,我的想法已经用完了.

我知道在哪里可以找到一个告诉IDE将输出定向到Messages窗口的设置?

java intellij-idea gradle gradlew

15
推荐指数
3
解决办法
8840
查看次数

使用注释来监视/记录/报告访问给定方法的线程的java工具?

语境:

我为游戏创建了一个小型(java)多线程服务器.尽管我尽最大努力遵循最佳实践,但事实证明,一些旨在从一个线程调用的方法是从2个或更多线程调用的.经过调试和分析后,我设法"修复"了我的设计,但我想知道:

问题:

是否有一个工具(或者如果不-是有可能(以及如何)开发),它允许您标记一些方法中包含注释@SingleThread@ThreadCount(2)@ThreadNameLike("my_fancy_thread_group*")用于计数/监视/日志访问这些方法,如:

  • @SingleThread - 检查此方法是否始终仅由线程访问
  • @ThreadCount(2) - 完全由两个线程访问
  • @ThreadNameLike - 仅由名称与模式匹配的线程访问

我们的想法是对程序进行TEST运行,并至少获得违反注释条件的日志记录.

我当时认为可能AspectJ可以通过它的切入点来完成这项工作但后来我意识到类似于Dagger/Dagger2的方法会更好,即当你想测试你的服务器时你必须打开一个注释处理器(让我们假设它称为"SafetyFirst",它将生成包含监视代码的适配器(包装器?)类.然后,您将运行服务器,运行一些负载测试,然后检查日志是否存在违规(或在理想的世界中 - 获取报告文件).

我完全意识到这样的工具:

  • 不会对所有潜在案件提供100%的报道;
  • 将掩盖/触发heisenbugs
  • 将减慢检查的程序

但至少它可以作为一个早期预警系统,清楚地宣传违反预期设计的行为.

java multithreading aspectj thread-safety

12
推荐指数
1
解决办法
954
查看次数

Facebook SDK中定义的登录请求代码常量(64206)在哪里

我在Android上使用Facebook SDK(4.*).刚刚使用LoginManager's以编程方式登录(不使用"LoginButton")logInWithReadPermissions().为了使回调起作用,我需要调用FacebookCallbackManager.onActivityResult(requestCode, resultCode, data);我在activity的onActivityResult方法中执行的操作.

但是,我的onActivityResult句柄结果形成了几个返回活动,并检查requestCode以查看返回的活动.我看到facebook登录返回64206但我无法找到定义该常量的位置.我不想硬编码64206,我想知道:有人知道Facebook SDK中定义的结果代码在哪里(并且是公开的)?

android facebook

12
推荐指数
3
解决办法
5021
查看次数

如何在每个单元测试中获取我的Application类的新实例?

我有一个Android应用程序,其中包含MyApplication继承自的类Application.

我创建了几个运行的单元测试@RunWith(AndroidJUnit4.class).如果我单独运行每个测试,他们都会通过.如果我一起运行 - 第一个通过然后(其中一些)其他人失败.

问题是,似乎只MyApplication创建了一个实例,然后将其保留并用于导致失败的所有测试,因为其中只有一个状态MyApplication必须初始化一次.

有没有办法运行单元测试(androidTest)所以应用程序重新启动每个测试?我不在乎它是否会很慢(例如每次都必须重新安装应用程序)我只想让测试彼此独立运行.

单元测试的实际代码如下(根据@Zinc的要求):

@RunWith(AndroidJUnit4.class)
public class AutoLogin_ActMainTest {
    @Rule
    public ActivityTestRule<ActMain> mActivityRule = new ActivityTestRule<ActMain>(
            ActMain.class) {


        @Override
        protected void beforeActivityLaunched() {
            super.beforeActivityLaunched();

            MyTestApp app = (MyTestApp) InstrumentationRegistry.getInstrumentation().getTargetContext().getApplicationContext();
            DependencyInjector.reset();
            app.reset();


            FakeUnitDaggerModule fudm = new FakeUnitDaggerModule();

            Session session = new SessionImpl(new TimeProviderImpl());
            fudm.setResMain(new ResMainTest(session));

            FakeAppPrefs appPrefs = new FakeAppPrefs();
            FakeLoginPrefs loginPrefs = new FakeLoginPrefs();
            CurrentUserHolder currentUserHolder = new CurrentUserHolder();

            FakeComponent inj = DaggerFakeComponent.builder().
                    fakeMyAppDaggerModule(new FakeMyAppDaggerModule(app, appPrefs, loginPrefs, …
Run Code Online (Sandbox Code Playgroud)

android unit-testing

12
推荐指数
1
解决办法
2360
查看次数

无法安装APK托管我自己的apache服务器

我从eclipse导出了一个apk.如果我将它复制到手机的SD卡,我可以毫无问题地安装它.

当试图通过手机(Galaxy S)浏览器下载时,我得到:"下载失败".

我在mime.types中设置了mime类型的application/vnd.android.package-archive,重启了apache,结果仍然相同.还尝试过:

<a href="downloads/my_apk.apk" type="application/vnd.android.package-archive">Download App</a>
Run Code Online (Sandbox Code Playgroud)

仍然没有运气.

我可以从Android市场下载和安装应用程序.我怀疑apache没有发送mime类型,但这只是在黑暗中拍摄.如何解决问题并能够从我的Web服务器安装APK?(或至少检查apache是​​否使用mime类型发送正确的标头)

任何帮助将不胜感激.

android

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

为什么有insertOrThrow但没有updateOrThrow或deleteOrThrow?

我正在创建使用SQLite数据库的android应用程序.看看SQLiteDatabase类,我发现有一个insertOrThrow()类似于insert()但有一个重要区别的方法 - 如果插入失败则会抛出异常而app会死(如果没有捕获).我insertOrThrow()在开发的初始阶段使用,因为它以非常明显的方式引起我对SQL错误的注意,即应用程序死亡.
我只是好奇:为什么没有updateOrThrow(),deleteOrThrow()等等...我试图谷歌的信息,但没有找到任何东西......

android

9
推荐指数
1
解决办法
2715
查看次数

Eclipse插件用于记录在给定项目/文件/方法上花费的时间?

我经常发现自己在一个月和同一个月/周工作两个或更多项目.有时我被迫在白天在项目之间切换,并且在每个项目上正确记录小时花费成为一场噩梦.

是否有一个eclipse插件会记录在给定的项目/文件/方法上花费的时间?我想它会包含一些计时器来计算每个项目花费的时间(当检测到不活动时停止).

我知道这样的测量不会非常精确,但我不需要这么精确.我需要像日志这样的东西:

12:45:01 - Opened project Proj1
12:45:03 - Opened file .../somefile.java
12:48:07 - Opened file .../someotherfile.java
12:50:22 - Focus switched to .../somefile.java
...
13:20:21 - Closed project Proj1
13:20:25 - Opened project Proj2
... and so on.
Run Code Online (Sandbox Code Playgroud)

这样的日志将允许我计算我在proj1上花了多少时间,在proj 2上花了多少时间等等...

java eclipse plugins

8
推荐指数
1
解决办法
4276
查看次数