嗨,我正在网上学习dagger2。我找到了一个开发人员尝试以某种方式使用改造来执行webservice的示例。我有几个问题。
第1个问题
此声明在@Inject Retrofit retrofit;
中的作用MainActivity.java
是什么?
第二个问题
NetModule.java
执行方法下面的顺序或基础是什么?
第3个问题
这里AppModule的用途是什么?
第4个问题
此声明将在((AppApplication) getApplication()).getNetComponent().inject(this);
MainActivity.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();
}
}
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());
}
});
}
}
@Module
public class AppModule extends Application {
Application mApplication;
public AppModule(Application mApplication) {
this.mApplication = mApplication;
}
@Provides
@Singleton
Application provideApplication() {
return mApplication;
}
}
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;
}
}
答案 0 :(得分:0)
1)表示将注入变量。当你在Activity上调用inject时,inject函数将使用反射来查找用@Inject标记的所有变量并将它们填入。(它实际上更倾向于使用注入的构造函数,但这不可能对于活动或大多数观点)。
2)根据需要执行。当注入一个类的实例时,Dagger会找到它需要填充的变量。然后它遍历模块中的方法,寻找一个用@Provides注释并返回正确类型的方法。然后它将调用它并将注入的变量设置为返回值。 (这是一个轻微的简化,不考虑范围和命名注入)。
3)AppModule将用于提供应用程序,因此您不需要将其设为单例。如果您想在某些地方使用上下文并且不想将其传递给一系列来电者,这将非常有用。
4)如上所述,它注入主要活动。我真的建议你阅读一些关于Dagger和依赖注入的教程。您显然错过了使用它需要了解的一些关键概念。