Android und Multithreading
Wie bereits beim Milliarden Dollar Fehler beschrieben erleichtert uns eine aktuellere Java Version die Android - Programmierung wesentlich. Anbei ein Android REST Client Beispiel, das eine Liste von Todos vom json-placeholder herunterlädt und die Ergebnisse in einer ListView darstellt.
Den vollständigen Source Code finden Sie in den software-tutorials.
package ...;
import ...
public class MainActivity extends Activity {
@Data
static class ToDo {
int id, userId;
String title;
boolean completed;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Observable
.fromCallable(this::loadAllTodos)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(this::fillListViewWithTitlesOf);
}
@SneakyThrows
ToDo[] loadAllTodos() {
val url = new URL("https://jsonplaceholder.typicode.com/todos");
return new ObjectMapper().readValue(url, ToDo[].class);
}
void fillListViewWithTitlesOf(ToDo[] todos) {
val titlesOfTodos = Arrays.stream(todos)
.map(ToDo::getTitle)
.collect(Collectors.toList());
ListView listView = findViewById(R.id.listView);
listView.setAdapter(new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, titlesOfTodos));
}
}
Die Datei build.gradle muss noch entsprechend angepasst werden, um Java 8 zu verwenden. Hier wird compileOptions verwendet, um einen aktuelleren Java - Compiler zu verwenden. Weiters verwenden wir Lombok um auch mit der veralteten Java 8 Version etwas compakteren Code verwenden zu können.
android {
//...
compileOptions {
sourceCompatibility(JavaVersion.VERSION_1_8)
targetCompatibility(JavaVersion.VERSION_1_8)
}
//...
}
dependencies {
//... hier ihre üblichen dependencies und dann...
implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.11.3'
compileOnly group: 'org.projectlombok', name: 'lombok', version: '1.18.16'
annotationProcessor 'org.projectlombok:lombok:1.18.16'
}