Có rất nhiều câu trả lời tuyệt vời cho câu hỏi này, nhưng rất nhiều thư viện tuyệt vời đã xuất hiện kể từ khi những câu trả lời đó được đăng. Điều này được dự định là một loại hướng dẫn người mới.
Tôi sẽ bao gồm một số trường hợp sử dụng để thực hiện các hoạt động mạng và một hoặc hai giải pháp cho mỗi trường hợp.
ReST qua HTTP
Điển hình là Json, có thể là XML hoặc một cái gì đó khác
Truy cập API đầy đủ
Giả sử bạn đang viết một ứng dụng cho phép người dùng theo dõi giá cổ phiếu, lãi suất và tỷ giá hối đoái. Bạn tìm thấy API Json trông giống như thế này:
http://api.example.com/stocks //ResponseWrapper<String> object containing a list of Srings with ticker symbols
http://api.example.com/stocks/$symbol //Stock object
http://api.example.com/stocks/$symbol/prices //PriceHistory<Stock> object
http://api.example.com/currencies //ResponseWrapper<String> object containing a list of currency abbreviation
http://api.example.com/currencies/$currency //Currency object
http://api.example.com/currencies/$id1/values/$id2 //PriceHistory<Currency> object comparing the prices of the first currency (id1) to the second (id2)
Trang bị thêm từ Square
Đây là một lựa chọn tuyệt vời cho một API có nhiều điểm cuối và cho phép bạn khai báo các điểm cuối ReST thay vì phải mã hóa chúng riêng lẻ như với các thư viện khác như ion hoặc Volley. (trang web: http://sapes.github.io/retrofit/ )
Làm thế nào để bạn sử dụng nó với API tài chính?
xây dựng. nâng cấp
Thêm các dòng này vào cấp độ Mô-đun buid.gradle:
implementation 'com.squareup.retrofit2:retrofit:2.3.0' //retrofit library, current as of September 21, 2017
implementation 'com.squareup.retrofit2:converter-gson:2.3.0' //gson serialization and deserialization support for retrofit, version must match retrofit version
Tài chínhApi.java
public interface FinancesApi {
@GET("stocks")
Call<ResponseWrapper<String>> listStocks();
@GET("stocks/{symbol}")
Call<Stock> getStock(@Path("symbol")String tickerSymbol);
@GET("stocks/{symbol}/prices")
Call<PriceHistory<Stock>> getPriceHistory(@Path("symbol")String tickerSymbol);
@GET("currencies")
Call<ResponseWrapper<String>> listCurrencies();
@GET("currencies/{symbol}")
Call<Currency> getCurrency(@Path("symbol")String currencySymbol);
@GET("currencies/{symbol}/values/{compare_symbol}")
Call<PriceHistory<Currency>> getComparativeHistory(@Path("symbol")String currency, @Path("compare_symbol")String currencyToPriceAgainst);
}
Tài chínhApiBuilder
public class FinancesApiBuilder {
public static FinancesApi build(String baseUrl){
return new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.build()
.create(FinancesApi.class);
}
}
Đoạn trích tài chính
FinancesApi api = FinancesApiBuilder.build("http://api.example.com/"); //trailing '/' required for predictable behavior
api.getStock("INTC").enqueue(new Callback<Stock>(){
@Override
public void onResponse(Call<Stock> stockCall, Response<Stock> stockResponse){
Stock stock = stockCall.body();
//do something with the stock
}
@Override
public void onResponse(Call<Stock> stockCall, Throwable t){
//something bad happened
}
}
Nếu API của bạn yêu cầu Khóa API hoặc tiêu đề khác như mã thông báo người dùng, v.v. được gửi, Retrofit làm cho điều này trở nên dễ dàng (xem câu trả lời tuyệt vời này để biết chi tiết: https://stackoverflow.com/a/42899766/1024412 ).
Một lần truy cập ReST API
Giả sử bạn đang xây dựng một ứng dụng "thời tiết tâm trạng" tìm kiếm vị trí GPS của người dùng và kiểm tra nhiệt độ hiện tại trong khu vực đó và cho họ biết tâm trạng. Loại ứng dụng này không cần khai báo điểm cuối API; nó chỉ cần có thể truy cập một điểm cuối API.
Ion
Đây là một thư viện tuyệt vời cho loại truy cập này.
Vui lòng đọc câu trả lời tuyệt vời của msysmilu ( https://stackoverflow.com/a/28559884/1024412 )
Tải hình ảnh qua HTTP
Chuyền
Volley cũng có thể được sử dụng cho API ReST, nhưng do yêu cầu thiết lập phức tạp hơn nên tôi thích sử dụng Retrofit từ Square như trên ( http://sapes.github.io/retrofit/ )
Giả sử bạn đang xây dựng một ứng dụng mạng xã hội và muốn tải ảnh đại diện của bạn bè.
xây dựng. nâng cấp
Thêm dòng này vào cấp độ Mô-đun buid.gradle:
implementation 'com.android.volley:volley:1.0.0'
ImageFetch.java
Volley yêu cầu thiết lập nhiều hơn Retrofit. Bạn sẽ cần tạo một lớp như thế này để thiết lập RequestQueue, ImageLoader và ImageCache, nhưng nó không quá tệ:
public class ImageFetch {
private static ImageLoader imageLoader = null;
private static RequestQueue imageQueue = null;
public static ImageLoader getImageLoader(Context ctx){
if(imageLoader == null){
if(imageQueue == null){
imageQueue = Volley.newRequestQueue(ctx.getApplicationContext());
}
imageLoader = new ImageLoader(imageQueue, new ImageLoader.ImageCache() {
Map<String, Bitmap> cache = new HashMap<String, Bitmap>();
@Override
public Bitmap getBitmap(String url) {
return cache.get(url);
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
cache.put(url, bitmap);
}
});
}
return imageLoader;
}
}
user_view_dialog.xml
Thêm phần sau vào tệp xml bố cục của bạn để thêm hình ảnh:
<com.android.volley.toolbox.NetworkImageView
android:id="@+id/profile_picture"
android:layout_width="32dp"
android:layout_height="32dp"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
app:srcCompat="@android:drawable/spinner_background"/>
Người dùng XemDialog.java
Thêm mã sau vào phương thức onCreate (Fragment, Activity) hoặc hàm tạo (Dialog):
NetworkImageView profilePicture = view.findViewById(R.id.profile_picture);
profilePicture.setImageUrl("http://example.com/users/images/profile.jpg", ImageFetch.getImageLoader(getContext());
Picasso
Một thư viện tuyệt vời khác từ Square. Vui lòng xem trang web để biết một số ví dụ tuyệt vời: http://sapes.github.io/picasso/