相关疑难解决方法(0)

Dagger 2注入Android Context

我正在使用Dagger 2并使其工作,但我现在需要访问Android应用程序上下文.

我不清楚如何注入和访问上下文.我试过这样做如下:

@Module
public class MainActivityModule {    
    private final Context context;

    MainActivityModule(Context context) {
        this.context = context;
    }

@Provides @Singleton
Context provideContext() {
    return context;
}
Run Code Online (Sandbox Code Playgroud)

但是,这会导致以下异常:

java.lang.RuntimeException:无法创建应用程序:java.lang.IllegalStateException:必须设置mainActivityModule

如果我检查Dagger生成的代码,则会在此处引发此异常:

public Graph build() {  
    if (mainActivityModule == null) {
        throw new IllegalStateException("mainActivityModule must be set");
    }
    return new DaggerGraph(this);
}
Run Code Online (Sandbox Code Playgroud)

我不确定这是否是注入Context的正确方法 - 任何帮助将不胜感激.

android dependency-injection android-context dagger-2

30
推荐指数
4
解决办法
3万
查看次数

Android上下文没有活动?还有其他没有活动的节目?

我会尽力把它变成一个全面的问题:

我正在编写一个方法来获取一个包含Android设备城市名称的String,由LocationManagerand getLastKnownLocation()和所有这些确定.

然后我意识到我需要在另一个活动中再次做同样的事情,那么为什么不在LocationFinder我的程序中创建一个完全独立的类(),而不是在任何地方编写重复的代码?

但是我遇到了困扰我的问题.例如,如果我创建这个类(LocationFinder),它是否应该扩展Activity,即使它实际上从未可视化?所有这些类会做的是有各种样的吸气剂getLastKnownCity()或getCurrentCity()与返回字符串.我假设它不会扩展Activity类,因为它实际上不是一个活动.

但是接下来我用什么Context:

Geocoder geocoder = new Geocoder(Context context, Locale locale)
Run Code Online (Sandbox Code Playgroud)

?

这让我认为它必须是一项活动.所以我扩展了Activity,并用构造函数替换了

@Override
protected void onCreate(..............
Run Code Online (Sandbox Code Playgroud)

但出于某种原因,即使我放了,也永远不会被召唤

String city = new LocationFinder().getLastKnownCity();
Run Code Online (Sandbox Code Playgroud)

我的第一行LocationFinder的onCreate()是

System.out.println("HEY!")
Run Code Online (Sandbox Code Playgroud)

它甚至都没有达到目的.我得到一个空指针android.internal.os.LoggingPrintStream.println()和其他东西.

另外,还有一堆来自Activity类的系统常量.例如,我需要得到LOCATION_SERVICE,这是一个String,如果不扩展Activity,我就无法获得.当然,我可以作弊,只是放入文字字符串,但这感觉不对.

gps android location android-context android-activity

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