相关疑难解决方法(0)

Android上的Dagger 2.存储和访问@Singleton组件的不同方法

这是关于如何存储@Singleton作用域Dagger 2组件的第N个问题,其寿命应该等于应用程序的生命周期.

在使用Dagger 2的Android应用程序中,通常至少有一个组件是@Singleton作用域,并且应该持续所有应用程序的生命周期:由于这些要求,它通常被初始化并存储在自定义Application类中.

由于我们的应用程序的所有部分都必须可以访问此Component的实例,因此我看到过这样的代码:

1.将组件存储在应用程序类内的公共静态变量中.

public class App extends Application {

    public static AppComponent appComponent;

    @Override
    public void onCreate() {
        super.onCreate();

        appComponent = DaggerAppComponent.builder()
                .appModule(new AppModule(this)).build();
    }
}
Run Code Online (Sandbox Code Playgroud)

这样它可以在任何其他地方访问:

App.appComponent.inject(this);
Run Code Online (Sandbox Code Playgroud)

2.将组件存储在应用程序实例内的私有变量中,并为其创建静态访问器.

public class App extends Application {

    private static AppComponent appComponent;

    @Override
    public void onCreate() {
        super.onCreate();

        appComponent = DaggerAppComponent.builder()
                .appModule(new AppModule(this)).build();
    }

    public static AppComponent getAppComponent() {
        return appComponent;
    }
}
Run Code Online (Sandbox Code Playgroud)

这样它可以在任何其他地方访问:

App.getAppComponent().inject(this);
Run Code Online (Sandbox Code Playgroud)

3.将组件存储在应用程序实例内的私有变量中,并为其创建非静态访问器.

public class App extends Application {

    private AppComponent appComponent;

    @Override
    public void onCreate() { …
Run Code Online (Sandbox Code Playgroud)

java android dagger-2

11
推荐指数
1
解决办法
1638
查看次数

在安全性方面,非最终公共实例和非最终公共实例字段之间的区别?

我正在浏览这个链接,OBJ10-J.不要使用公共静态非最终字段,它说,

客户端代码可以简单地访问公共静态字段,因为安全管理器不会检查对这些字段的访问.

那是什么意思呢?即逃离安全经理他们是什么意思?

如果他们只是意味着它,因为现场被非最终public,然后怎么来的非最终,public实例字段比他们不同static的同行?(就代码安全而言)

我已经经历过这个问题并且在安全方面没有看到任何提及,为什么静态变量被认为是邪恶的

publicclass的public static字段可以从任何地方访问,所以public实例字段也可以访问,那么区别在哪里?为什么非最终 public实例字段不是安全问题,而是存在static

java java-security

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

使用静态var和传递对象参数之间哪一个更好?

我想写一个APP来记录屏幕,有两种方式,RecordHelper_Method_A和RecordHelper_Method_B.

在RecordHelper_Method_A中,我将mMediaRecorder,MediaProjection mMediaProjection和mVirtualDisplay定义为静态var,它很容易调用,例如StartRecord( mContext, requestCode, resultCode,data),StopRecord().

在RecordHelper_Method_B中,我需要在主Activity类中定义mMediaRecorder,MediaProjection mMediaProjection,并在调用时传递参数StartRecord(mMediaRecorder, mMediaProjection,mVirtualDisplay),'StopRecord(mMediaRecorder,mMediaProjection,mVirtualDisplay)`......,这有点复杂.

我不知道哪一个更好,而且当我结束APP时,我不知道是否可以在RecordHelper_Method_A中正确释放这些静态var.

顺便说一句,如果你有更好的方法,请告诉我吗?谢谢!

RecordHelper_Method_A

public class RecordHelper_Method_A {

    private static MediaRecorder mMediaRecorder;
    private static MediaProjection mMediaProjection;
    private static VirtualDisplay mVirtualDisplay;

    public static void StartRecord(Context mContext,int requestCode, int resultCode, Intent data){

        mMediaRecorder = new MediaRecorder();
        initRecorder();

        MediaProjectionManager mProjectionManager = (MediaProjectionManager) mContext.getSystemService(Context.MEDIA_PROJECTION_SERVICE);
        mMediaProjection = mProjectionManager.getMediaProjection(resultCode, data);

        mVirtualDisplay=mMediaProjection.createVirtualDisplay("MainActivity",
                400,600, 300,
                DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,
                mMediaRecorder.getSurface(), null, null);

        MediaProjectionCallback mMediaProjectionCallback = new MediaProjectionCallback();
        mMediaProjection.registerCallback(mMediaProjectionCallback, null);

        mMediaRecorder.start();
    }

    public static void StopRecord(){
        mMediaProjection=null;
        mMediaRecorder.stop(); …
Run Code Online (Sandbox Code Playgroud)

java android

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

在所有Android活动中保持变量值

我有一个数据库,其中包含一行数据,可用于多个活动.我需要能够在所有活动中保留行ID,以便我可以使用我的数据库适配器在不同的活动中读取和写入数据.我已成功使用putExtra(Overthelimit.java)通过意图将行id传递给下一个活动.然后使用getExtra(Profile.java)为mRowId变量赋予行id.我现在的问题是让mRowId可用于其他活动,即MyUsual和DrinksList,这样我就可以随时更新数据.

你可以看到我尝试过putExtras,putSerializable但是无法让它工作.我想我错过了一些理解.

因此,对于我在下面的活动中的配置文件菜单选项,我可以将光标行id的值发送到Profile类:

 public class Overthelimit extends ListActivity {
private OverLimitDbAdapter dbHelper;
private Cursor cursor;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    this.getListView();
    dbHelper = new OverLimitDbAdapter(this);
    dbHelper.open();
    fillData();
    registerForContextMenu(getListView());
}


@Override
protected void onActivityResult(int requestCode, int resultCode,
        Intent intent) {
    super.onActivityResult(requestCode, resultCode, intent);
    fillData();

}
private void fillData() {
    cursor = dbHelper.fetchAllUserDrinks();
    startManagingCursor(cursor);
    //cursor.getCount();    

    String[] from = new String[] { OverLimitDbAdapter.KEY_USERNAME };
    int[] to = new int[] { R.id.label …
Run Code Online (Sandbox Code Playgroud)

android android-intent android-activity

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

仅为类创建一个对象并重用相同的对象

我想只创建一个类的一个对象,并一遍又一遍地重用同一个对象.有没有有效的方法来做到这一点.

我怎样才能做到这一点?

java

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

单元测试静态方法

我正在尝试为这里的方法解密编写测试用例。

    private static Codec codec;

    static {
        try {
            codec = new Codec(encryptionType, encryptionKey, false, true, false);
        } catch (CodecException e) {
            throw new RuntimeException("Codec initialisation failed", e);
        }
    }


    public static String decrypt(final String toDecrypt) throws CodecException {
        String decrypted = codec.decryptFromBase64(toDecrypt);
        if (decrypted.endsWith(":")) {
            decrypted = decrypted.substring(0, decrypted.length() - 1);
        }
        return decrypted;
    }
Run Code Online (Sandbox Code Playgroud)

测试用例:

    @Mock
    private Codec codec;
    @Test
    public void test_decrypt_Success() throws CodecException {
        when(codec.decryptFromBase64(TestConstants.toDecrypt)).thenReturn(TestConstants.decrypted);
        assertEquals(DocumentUtils.decrypt(TestConstants.toDecrypt), TestConstants.decrypted);
    }
Run Code Online (Sandbox Code Playgroud)

由于这是一个静态方法,我无法在测试套件中注入类的实例并模拟其编解码器。上面的代码按预期在 assert 处从编解码器库中抛出错误。

您测试此类静态方法的方法是什么?或者我根本不应该为此编写测试?

java testing static unit-testing mockito

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

在什么情况下我不应该在类中使用静态成员?

我不得不问这个问题,因为我觉得只有经验丰富的程序员才能知道类中静态成员的优缺点。我读过解释静态成员的书籍,根据我的观点,我也在我的项目中使用了许多静态成员。

据我了解,如果有某个类在我的项目中只使用了1次,我的意思是不需要创建一些或许多实例,我应该将其所有成员设为静态,尤其是静态方法。这是真的?这还有另一个好处,因为可以轻松调用静态成员,而无需创建新实例或在类之间传递实例。

在我的项目中使用静态成员并没有告诉我它有什么问题,我的项目似乎运行正常,当然我并不是说我喜欢使用静态成员并随机、频繁地使用它(正如我在上面解释我的观点)。我认为静态成员可能有一些优点和缺点(我不知道),我想从您的经验中了解。请与我分享。
谢谢你!

.net c# static

6
推荐指数
1
解决办法
1933
查看次数

在其他类中获取变量

我需要inString在其他课程中获得变量.我怎样才能做到这一点?

public class main {
    public static StringBuffer inString;


    public static void main(String[] args) {
        inString = new StringBuffer("Our aim is to make a 15 realistic game, where grinding powerlines and doing a tailwhip isn't easy, like in the real world. A game in which you will feel like you're actual riding. A game in which creativity and beauty are combined. ");
        inString = new StringBuffer(inString.toString().replaceAll(" +", " "));
        }
}
Run Code Online (Sandbox Code Playgroud)

所以我尝试System.out.println(main.inString);在我的Textcl.class中使用,但得到null.

java class

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

在接口默认方法中使用 spring 管理的 bean?

警告:我意识到这可能是对 spring bean 和/或 Java 8 的默认接口方法背后意图的滥用。我正在寻找的是对为什么这可能是一种我未能认识到的不安全方法的具体且合理的批评。

我定义了一个类,它使我可以静态访问正在运行的应用程序上下文:

@Component
public class BeanAccessor implements ApplicationContextAware {

    private static ApplicationContext applicationContext;

    public static <T> T getSingleton(Class<T> clazz){
        return applicationContext.getBean(clazz);
    }

    public static <T> T getSingleton(String beanName, Class<T> clazz){
        return applicationContext.getBean(beanName, clazz);
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        BeanAccessor.applicationContext = applicationContext;
    }

}
Run Code Online (Sandbox Code Playgroud)

然后我可以在默认接口方法中使用这些 BeanAccessor 方法,以便从方法内部访问 spring 管理的 bean。

我意识到可以通过实现其他类和服务来实现此功能,而不是觉得需要将它混合到当前的类和服务中(至少对于下面的示例,我实际上并没有对“this”做任何事情)。这在一定程度上是一种“艺术”偏好,我相信我会继续寻找其他用例。

请注意,我并没有像这里描述的那样尝试保留每个实例的状态https://kerflyn.wordpress.com/2012/07/09/java-8-now-you-have-mixins/我确实认识到存在危险在这样做。

这是一个示例用法:

public interface ClientAware {

    String TENANT_NAME = "TENANT_NAME";

    default ClientDetails clientDetails() {
        ClientDetailsService service …
Run Code Online (Sandbox Code Playgroud)

java spring java-8

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

从Activity调用finish()

我想知道,是finish();呼叫效应static变量.不static变量是受GC.

static int displayChart = 0;
Run Code Online (Sandbox Code Playgroud)

声明代码.

java static android garbage-collection

4
推荐指数
2
解决办法
232
查看次数