Dagger 2 Android实现更容易,它基于依赖注入体系结构。依赖注入是一种设计模式,它是面向对象编程的概念,在这种模式下,我们不使用new关键字(对于Java)在类内创建另一个类的对象。相反,我们从外部提供所需的对象。它是用于Java和Android的完全静态的编译时依赖项注入框架。它是由Square创建并由Google维护的早期版本的改编。注意,我们将使用Java语言实现该项目。
关于Dagger 2的理论部分
- 依赖提供程序:依赖关系是我们需要在类内部实例化的对象。我们不能在一个类中实例化一个类。将向我们提供称为依赖项的对象的人称为“依赖项提供程序”。 dagger2是您要创建依赖关系提供程序的类,它需要使用@Module注释对其进行注释。
- 依赖消费者:依赖消费者是我们需要实例化对象的类。 Dagger将提供依赖关系,为此,我们只需要使用@Inject注释对象声明即可。
- 组件:我们的依赖项提供程序和依赖项使用者之间的连接是通过接口提供的,方法是使用@Component进行注释。其余的事情将由Dagger完成。
例子
步骤1:创建一个新项目
要在Android Studio中创建新项目,请参阅如何在Android Studio中创建/启动新项目。请注意,选择Java作为编程语言。
第2步:首先进入编码部分,您必须做一些准备工作
在转到编码部分之前,您必须先执行一些预任务。转到应用程序> res>值> colors.xml部分,然后为您的应用程序设置颜色。
XML
#0F9D58
#0F9D58
#FF4081
XML
Java
import android.app.Application;
import javax.inject.Singleton;
import dagger.Module;
import dagger.Provides;
@Module
class AppModule {
private Application mApplication;
AppModule(Application mApplication) {
this.mApplication = mApplication;
}
@Provides
@Singleton
Application provideApplication() {
return mApplication;
}
}
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
class ApiModule {
String mBaseUrl;
ApiModule(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();
}
}
Java
import javax.inject.Singleton;
import dagger.Component;
@Singleton
@Component(modules = {AppModule.class, ApiModule.class})
public interface ApiComponent {
void inject(MainActivity activity);
}
Java
import android.app.Application;
public class MyApplication extends Application {
private ApiComponent mApiComponent;
@Override
public void onCreate() {
super.onCreate();
// https://restcountries.eu/rest/v2/all -> It will list all the country details
mApiComponent = DaggerApiComponent.builder()
.appModule(new AppModule(this))
.apiModule(new ApiModule("https://restcountries.eu/rest/v2/"))
.build();
}
public ApiComponent getNetComponent() {
return mApiComponent;
}
}
Java
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import java.util.List;
import javax.inject.Inject;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
public class MainActivity extends AppCompatActivity {
// injecting retrofit
@Inject Retrofit retrofit;
ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// injecting here
((MyApplication) getApplication()).getNetComponent().inject(this);
listView = (ListView) findViewById(R.id.listViewCountries);
getCountries();
}
private void getCountries() {
Api api = retrofit.create(Api.class);
// Call> call = RetrofitClient.getInstance().getMyApi().getCountries();
Call> call = api.getCountries();
call.enqueue(new Callback>() {
@Override
public void onResponse(Call> call, Response> response) {
List countryList = response.body();
// Creating an String array for the ListView
String[] countries = new String[countryList.size()];
// looping through all the countries and inserting
// the names inside the string array
for (int i = 0; i < countryList.size(); i++) {
countries[i] = countryList.get(i).getName();
}
// displaying the string array into listview
listView.setAdapter(new ArrayAdapter(getApplicationContext(), android.R.layout.simple_list_item_1, countries));
}
@Override
public void onFailure(Call> call, Throwable t) {
Toast.makeText(getApplicationContext(), t.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
}
转到Gradle脚本> build.gradle(模块:应用程序)部分,导入以下依赖项,然后在上面的弹出窗口中单击“立即同步”。
// these two lines are added for retrofit
implementation ‘com.squareup.retrofit2:retrofit:2.7.2’
implementation ‘com.squareup.retrofit2:converter-gson:2.7.2’
// these two lines are added for dagger
implementation ‘com.google.dagger:dagger:2.13’
annotationProcessor ‘com.google.dagger:dagger-compiler:2.13’
转到应用程序>清单> AndroidManifests.xml部分,并允许“ Internet权限”。以下是AndroidManifests.xml文件的代码。
步骤3:设计UI
以下是activity_main.xml文件的代码。这将位于app> src> main> res> layout文件夹下。取决于不同的分辨率,有时我们可能需要在版面> hdpi或版面> xhdpi文件夹等下使用它。
XML格式
步骤4:使用Java文件
应用模块。 Java文件:
在Retrofit(Retrofit是Java和Android的REST客户端)中,我们需要上下文对象。为了提供对象,因此在这里我们将创建该模块,该模块将为我们提供上下文。
Java
import android.app.Application;
import javax.inject.Singleton;
import dagger.Module;
import dagger.Provides;
@Module
class AppModule {
private Application mApplication;
AppModule(Application mApplication) {
this.mApplication = mApplication;
}
@Provides
@Singleton
Application provideApplication() {
return mApplication;
}
}
使用匕首时,我们只需要单个实例时就需要注释@Singleton。
API模块。 Java的:
对于翻新,我们需要一堆东西。缓存,Gson,OkHttpClient和改造本身。因此,我们将在此模块中为这些对象定义提供程序。
- Gson:这是一个Java库,可用于将Java对象转换为其JSON表示形式。
- Okhttp:与Retrofit配合使用,Retrofit是REST的出色API。
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
class ApiModule {
String mBaseUrl;
ApiModule(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();
}
}
建筑构件:ApiComponent。Java
Java
import javax.inject.Singleton;
import dagger.Component;
@Singleton
@Component(modules = {AppModule.class, ApiModule.class})
public interface ApiComponent {
void inject(MainActivity activity);
}
我们将注入MainActivity。我们还使用@Component注释定义了所有模块,如代码所示。
我的应用程序。 Java文件:
Java
import android.app.Application;
public class MyApplication extends Application {
private ApiComponent mApiComponent;
@Override
public void onCreate() {
super.onCreate();
// https://restcountries.eu/rest/v2/all -> It will list all the country details
mApiComponent = DaggerApiComponent.builder()
.appModule(new AppModule(this))
.apiModule(new ApiModule("https://restcountries.eu/rest/v2/"))
.build();
}
public ApiComponent getNetComponent() {
return mApiComponent;
}
}
主要活动。 Java文件:
Java
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import java.util.List;
import javax.inject.Inject;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
public class MainActivity extends AppCompatActivity {
// injecting retrofit
@Inject Retrofit retrofit;
ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// injecting here
((MyApplication) getApplication()).getNetComponent().inject(this);
listView = (ListView) findViewById(R.id.listViewCountries);
getCountries();
}
private void getCountries() {
Api api = retrofit.create(Api.class);
// Call> call = RetrofitClient.getInstance().getMyApi().getCountries();
Call> call = api.getCountries();
call.enqueue(new Callback>() {
@Override
public void onResponse(Call> call, Response> response) {
List countryList = response.body();
// Creating an String array for the ListView
String[] countries = new String[countryList.size()];
// looping through all the countries and inserting
// the names inside the string array
for (int i = 0; i < countryList.size(); i++) {
countries[i] = countryList.get(i).getName();
}
// displaying the string array into listview
listView.setAdapter(new ArrayAdapter(getApplicationContext(), android.R.layout.simple_list_item_1, countries));
}
@Override
public void onFailure(Call> call, Throwable t) {
Toast.makeText(getApplicationContext(), t.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
}
输出:
请求示例:
https://restcountries.eu/rest/v2/all将提供如图所示的输出。我们将以此为国名
示例响应:
上面的REST API URL的输出
当我们仅使用国家名称时,我们将获得像阿富汗,…..印度等的列表,执行上面的代码后,我们可以得到如下所示的输出。
您可以找到源代码:https://github.com/raj123raj/dagger-retrofit