La implementación de Android Dagger 2 es más sencilla y se basa en la arquitectura de inyección de dependencia. La Inyección de Dependencia es un patrón de diseño, que es un concepto de Programación Orientada a Objetos, donde no creamos un objeto de otra clase dentro de una clase usando la nueva palabra clave (para Java). En cambio, suministramos el objeto necesario desde el exterior. Es un marco de inyección de dependencia en tiempo de compilación completamente estático para Java y Android. Es una adaptación de una versión anterior creada por Square y ahora mantenida por Google.
La parte teórica sobre Dagger 2
- Proveedor de dependencias: Las dependencias son los objetos que necesitamos instanciar dentro de una clase. No podemos instanciar una clase dentro de una clase. La persona que nos va a proporcionar los objetos que se llaman dependencias se llama Dependency Provider. dagger2 es la clase que desea convertir en un proveedor de dependencias. Debe anotarlo con la anotación @Module .
- Consumidor de dependencia: el consumidor de dependencia es una clase en la que necesitamos instanciar los objetos. Dagger proporcionará la dependencia, y para esto, solo necesitamos anotar la declaración del objeto con @Inject.
- Componente: la conexión entre nuestro proveedor de dependencias y el consumidor de dependencias se proporciona a través de una interfaz anotándola con @Component . Y el resto del asunto lo hará Dagger.
Ejemplo
Paso 1: Crear un nuevo proyecto
Para crear un nuevo proyecto en Android Studio, consulte Cómo crear/iniciar un nuevo proyecto en Android Studio . Tenga en cuenta que seleccione Java como lenguaje de programación.
Paso 2:
Antes de ir a la sección de codificación, primero debe hacer una tarea previa. Vaya a la sección aplicación > res > valores > colores.xml y configure los colores para su aplicación.
XML
<?xml version="1.0" encoding="utf-8"?> <resources> <color name="colorPrimary">#0F9D58</color> <color name="colorPrimaryDark">#0F9D58</color> <color name="colorAccent">#FF4081</color> </resources>
Vaya a la sección Gradle Scripts > build.gradle (Módulo: aplicación) e importe las siguientes dependencias y haga clic en » Sincronizar ahora » en la ventana emergente anterior.
// estas dos líneas se agregan para la actualización
implementación ‘com.squareup.retrofit2:retrofit:2.7.2’
implementación ‘com.squareup.retrofit2:convertidor-gson:2.7.2’
// estas dos lineas se agregan para daga
implementación ‘com.google.dagger:dagger:2.13’
anotaciónProcesador ‘com.google.dagger:dagger-compiler:2.13’
Vaya a la sección aplicación> manifiestos> AndroidManifests.xml y permita «Permiso de Internet». A continuación se muestra el código para el archivo AndroidManifests.xml .
<!– el permiso de Internet, entonces solo se pueden recuperar las llamadas api –>
<usos-permiso android:name=”android.permission.INTERNET” />
Paso 3: Diseño de la interfaz de usuario
A continuación se muestra el código para el archivo activity_main.xml . Esto estará en la carpeta app > src > main > res > layout . Depende de las diferentes resoluciones, a veces es posible que necesitemos tenerlo en las carpetas diseño> hdpi o diseño> xhdpi, etc.
XML
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <ListView android:id="@+id/listViewCountries" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/colorPrimaryDark"/> </RelativeLayout>
Paso 4: trabajar con el archivo Java
Archivo App Module.java:
En Retrofit (Retrofit es un cliente REST para Java y Android), necesitamos el objeto de contexto . Para suministrar los objetos, entonces aquí crearemos este módulo que nos dará el Contexto.
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; } }
Con la daga, debemos anotar @Singleton cuando queremos una sola instancia.
Módulo API.java:
Para Retrofit, necesitamos un montón de cosas. Cache, Gson, OkHttpClient y el propio Retrofit. Así que definiremos los proveedores para estos objetos aquí en este módulo.
- Gson: es una biblioteca de Java que se puede usar para convertir objetos de Java en su representación JSON.
- Okhttp: funciona con Retrofit, que es una API brillante para REST.
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(); } }
Componente de construcción: ApiComponent.java
Java
import javax.inject.Singleton; import dagger.Component; @Singleton @Component(modules = {AppModule.class, ApiModule.class}) public interface ApiComponent { void inject(MainActivity activity); }
Inyectaremos en MainActivity. También definimos todos los módulos usando la anotación @Component como podemos ver en el código.
Archivo MiAplicación.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; } }
Archivo MainActivity.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<List<Country>> call = RetrofitClient.getInstance().getMyApi().getCountries(); Call<List<Country>> call = api.getCountries(); call.enqueue(new Callback<List<Country>>() { @Override public void onResponse(Call<List<Country>> call, Response<List<Country>> response) { List<Country> 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<String>(getApplicationContext(), android.R.layout.simple_list_item_1, countries)); } @Override public void onFailure(Call<List<Country>> call, Throwable t) { Toast.makeText(getApplicationContext(), t.getMessage(), Toast.LENGTH_SHORT).show(); } }); } }
Producción:
Solicitud de ejemplo:
https://restcountries.eu/rest/v2/all proporcionará el resultado como se muestra en la imagen. Tomaremos el nombre del país de ese
Ejemplo de respuesta:
El resultado de la URL de la API REST anterior
Como solo estamos tomando nombres de países, obtendremos una lista como Afganistán, … India, etc. Al ejecutar el código anterior, podemos obtener el resultado como se muestra a continuación.
Puede encontrar el código fuente: https://github.com/raj123raj/dagger-retrofit
Publicación traducida automáticamente
Artículo escrito por priyarajtt y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA