Minule jsme si ukázali, jak použít Retrofit v Android studiu. Dnes se podíváme na synchronní a asynchronní požadavky.
Synchronní požadavek
Při synchronním požadavku, je na server odeslán požadavek, aplikace se „zastaví“ a čeká, dokud neobdrží odpověď od serveru.
Asynchronní požadavek
Při asynchronním požadavku se používají tzv. callbacky. Na server se odešle požadavek (stejně jako při synchronním požadavku) ale nečeká se na odpověď a kód pokračuje dál. Na odpověď ze serveru čeká callback, který provede požadovanou operaci s odpovědí od serveru. Tento callback se může zavolat kdykoliv (odpověď od serveru trvá různě dlouho).
V kódu je vidět asynchronní volání, které je shodné jako v prvním seznámení s Retrofit, přibylo synchronní volání:
package cz.vencax.retrofit;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import java.io.IOException;
import cz.vencax.retrofit.model.Book;
import cz.vencax.retrofit.model.Books;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final Button button = findViewById(R.id.buttonAsynchronous);
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
getBooksFromApiAsynchronous();
}
});
final Button buttonPost = findViewById(R.id.buttonSynchronous);
buttonPost.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
try {
getBooksFromApiSynchronous();
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
/**
* Asynchronous Retrofit request
*/
private void getBooksFromApiAsynchronous() {
Log.d("xxx", "getBooksFromApiAsynchronous");
BookService bookService = RetrofitClient.getClient().create(BookService.class);
Call<Books> books = bookService.getAllBooks();
books.enqueue(new Callback<Books>() {
@Override
public void onResponse(Call<Books> call, Response<Books> response) {
Log.d("xxx", "Asynchronous onResponse: " + response);
if (response.isSuccessful()) {
Log.d("xxx", "Asynchronous response.isSuccessful()" + response.body());
Books books = response.body();
Log.d("xxx", "Asynchronous response.isSuccessful(), books count: " + books.getBooks().size());
for (Book book : books.getBooks()) {
Log.d("xxx", "Asynchronous Book: " + book.getTitle() + ", " + book.getAuthor());
}
} else {
Log.d("xxx", "Asynchronous response NOT isSuccessful()" + response.errorBody().source());
}
}
@Override
public void onFailure(Call<Books> call, Throwable t) {
Log.d("xxx", "Asynchronous onFailure: " + t);
}
});
}
/**
* Synchronous Retrofit request
*/
private void getBooksFromApiSynchronous() throws IOException {
Log.d("xxx", "getBooksFromApiSynchronous");
BookService bookService = RetrofitClient.getClient().create(BookService.class);
Call<Books> call = bookService.getAllBooks();
Books books = call.execute().body();
Log.d("xxx", "Synchronous response.isSuccessful(), books count: " + books.getBooks().size());
for (Book book : books.getBooks()) {
Log.d("xxx", "Synchronous Book: " + book.getTitle() + ", " + book.getAuthor());
}
}
}