使用匕首2

时间:2017-02-28 06:59:46

标签: java android dagger-2

嗨,我正在网上学习dagger2。我找到了一个开发人员尝试以某种方式使用改造来执行webservice的示例。我有几个问题。

  

第1个问题

此声明在@Inject Retrofit retrofit;中的作用MainActivity.java是什么?

  

第二个问题

NetModule.java执行方法下面的顺序或基础是什么?

  

第3个问题

这里AppModule的用途是什么?

  

第4个问题

此声明将在((AppApplication) getApplication()).getNetComponent().inject(this);

中执行MainActivity.java

提前致谢

NetModule.java

import android.app.Application;

import com.google.gson.FieldNamingPolicy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

import javax.inject.Singleton;

import dagger.Module;
import dagger.Provides;
import okhttp3.Cache;
import okhttp3.OkHttpClient;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

@Module
public class NetModule {

    String mBaseUrl;

    public NetModule(String mBaseUrl) {
        this.mBaseUrl = mBaseUrl;
    }

    @Provides
    @Singleton
    Cache provideHttpCache(Application application) {
        int cacheSize = 10 * 1024 * 1024;
        Cache cache = new Cache(application.getCacheDir(), cacheSize);
        return cache;
    }

    @Provides
    @Singleton
    Gson provideGson() {
        GsonBuilder gsonBuilder = new GsonBuilder();
        gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES);
        return gsonBuilder.create();
    }

    @Provides
    @Singleton
    OkHttpClient provideOkhttpClient(Cache cache) {
        OkHttpClient.Builder client = new OkHttpClient.Builder();
        client.cache(cache);
        return client.build();
    }

    @Provides
    @Singleton
    Retrofit provideRetrofit(Gson gson, OkHttpClient okHttpClient) {
        return new Retrofit.Builder()
                .addConverterFactory(GsonConverterFactory.create(gson))
                .baseUrl(mBaseUrl)
                .client(okHttpClient)
                .build();
    }

}

MainActivity.java

public class MainActivity extends AppCompatActivity {

    @Inject
    Retrofit retrofit;

    private String TAG = getClass().getName();

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

        ((AppApplication) getApplication()).getNetComponent().inject(this);


        Call<List<Post>> posts = retrofit.create(Restapi.class).getPosts();

        //Enque the call
        posts.enqueue(new Callback<List<Post>>() {
            @Override
            public void onResponse(Call<List<Post>> call, Response<List<Post>> response) {
                Log.d(TAG, response.body().toString());
            }

            @Override
            public void onFailure(Call<List<Post>> call, Throwable t) {
                Log.d(TAG, t.toString());
            }
        });
    }
}

AppModule.java

@Module
public class AppModule extends Application {

    Application mApplication;

    public AppModule(Application mApplication) {
        this.mApplication = mApplication;
    }

    @Provides
    @Singleton
    Application provideApplication() {
        return mApplication;
    }
}

AppApplication.java

import android.app.Application;

import com.nagarro.daggerdemo.dagger.component.DaggerNetComponent;
import com.nagarro.daggerdemo.dagger.component.NetComponent;
import com.nagarro.daggerdemo.dagger.model.AppModule;
import com.nagarro.daggerdemo.dagger.model.NetModule;

public class AppApplication extends Application {

    private NetComponent mNetComponent;

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

        mNetComponent = DaggerNetComponent.builder()
                .appModule(new AppModule(this))
                .netModule(new NetModule("https://jsonplaceholder.typicode.com/"))
                .build();
    }

    public NetComponent getNetComponent() {
        return mNetComponent;
    }

}

1 个答案:

答案 0 :(得分:0)

1)表示将注入变量。当你在Activity上调用inject时,inject函数将使用反射来查找用@Inject标记的所有变量并将它们填入。(它实际上更倾向于使用注入的构造函数,但这不可能对于活动或大多数观点)。

2)根据需要执行。当注入一个类的实例时,Dagger会找到它需要填充的变量。然后它遍历模块中的方法,寻找一个用@Provides注释并返回正确类型的方法。然后它将调用它并将注入的变量设置为返回值。 (这是一个轻微的简化,不考虑范围和命名注入)。

3)AppModule将用于提供应用程序,因此您不需要将其设为单例。如果您想在某些地方使用上下文并且不想将其传递给一系列来电者,这将非常有用。

4)如上所述,它注入主要活动。

我真的建议你阅读一些关于Dagger和依赖注入的教程。您显然错过了使用它需要了解的一些关键概念。