MySQL-Datenbank mit Square Libraries – Activity, Helferklassen, Interface Teil 2

von Ludy geschrieben am und aktualisiert am
Kategorien MySQL Datenbank
Schlagwörter , , , , ,

Bevor wir zum Kern kommen, brauchen wir eine Struktur, da wir mit Json bzw. Gson arbeiten.
Wir haben später ein Array (ArrayList<>), welches Devices heißt und Details.

Schematisch würde das so aussehen:

Devices
    |_____id_____manufacturer_____type
    |_____id_____manufacturer_____type
    |_____id_____manufacturer_____type

Die Model-Klasse nenne ich sinnvollerweise Devices.java in der wir auch gleich die Details-Klasse einbetten.

Devices.java

public class Devices {
    @SerializedName("devices")
    private ArrayList<Details> details;

    public ArrayList<Details> getDetails() {
        return details;
    }

    public class Details {
        private String id;
        private String manufacturer;
        private String type;

        public String getId() {
            return id;
        }

        public String getManufacturer() {
            return manufacturer;
        }

        public String getType() {
            return type;
        }
    }
}

Für Retrofit benötigen wir ein Interface – ApiService.java – zum empfangen der Daten nutzen wir an dieser Stelle GET als Methode. In der Klammer von @GET ist der Pfad zur zu triggernden Datei, dem Call wird die Klasse Devices übergeben.

ApiService.java

public interface ApiService {

    String BASE_URL = "http://192.168.188.20:8080";

    @GET("/api/devices.php")
    Call<Devices> getDevices();
}

Das Interface wir für die einzelnen App-Funktionen nach und nach erweitert.

In der MainActivity.java müssen wir unsern RecyclerView initialisieren, die Toolbar sollte von AS schon initialisiert sein.
Nun erstellen wir uns eine Variable vom Type:

private Retrofit restApi;
private ApiService urlApiService;
private Call<Devices> mDevicesCall;
private ArrayList<Devices.Details> details;

restApi wird über den Builder die BASE_URL übergeben und angewiesen Gson zu konvergieren.
apiService wird von restApi erstellt, es wird ein Proxy-Service herstellt und die ApiService.class übergeben.
mDevicesCall wird der definierte Call von apiService über geben getDevices() und mit enqueue ein Callback von Devices eingebettet. Darin wir der Response bzw. der Fail zur Weiterverarbeitung implementiert.

MainActivity.java

public class MainActivity extends AppCompatActivity {

    private RecyclerView mRecyclerView;
    private Retrofit restApi;
    private ApiService apiService;
    private Call<Devices> mDevicesCall;
    private ArrayList<Devices.Details> details;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
        mRecyclerView.setHasFixedSize(true);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
        restApi = new Retrofit.Builder()
                .baseUrl(ApiService.BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        apiService = restApi.create(ApiService.class);
        mDevicesCall = apiService.getDevices();
        mDevicesCall.enqueue(new Callback<Devices>() {
            @Override
            public void onResponse(Call<Devices> call, Response<Devices> response) {
                details = response.body().getDetails();
                for (Devices.Details d : details) {
                    Log.d("TAG", d.getId());
                }
            }

            @Override
            public void onFailure(Call<Devices> call, Throwable t) {
                 Log.d("TAG", t.getLocalizedMessage());
            }
        });
    }
}