这个问题已经有很多很棒的答案,但是自从这些答案发布以来,已经出现了很多很棒的库。这是一种新手指南。
我将介绍几个用于执行网络操作的用例,并为每个用例提供一两个解决方案。
基于 HTTP 的REST
通常是 JSON,但它可以是 XML 或其他东西。
完整的 API 访问权限
假设您正在编写一个应用程序,让用户可以跟踪股票价格、利率和货币汇率。您会发现一个如下所示的 JSON API:
http://api.example.com/stocks // ResponseWrapper<String> object containing a
// list of strings 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)
从 Square 改造
对于具有多个端点的 API,这是一个很好的选择,它允许您声明 REST 端点,而不必像Amazon Ion Java或Volley(网站:Retrofit )等其他库那样单独编码它们。
您如何将它与财务 API 一起使用?
文件build.gradle
将这些行添加到您的模块级build.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
文件FinanceApi.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);
}
班级财务ApiBuilder
public class FinancesApiBuilder {
public static FinancesApi build(String baseUrl){
return new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.build()
.create(FinancesApi.class);
}
}
类FinancesFragment片段
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
}
}
如果您的 API 需要发送 API 密钥或其他标头,例如用户令牌等,Retrofit 可以轻松完成(有关详细信息,请参阅在 Retrofit中添加标头参数的精彩答案)。
一次性 REST API 访问
假设您正在构建一个“心情天气”应用程序,它会查找用户的 GPS 位置并检查该区域的当前温度并告诉他们心情。这种类型的应用不需要声明 API 端点;它只需要能够访问一个 API 端点。
离子
对于此类访问,这是一个很棒的库。
请阅读msysmilu对How can I fix 'android.os.NetworkOnMainThreadException' 的精彩回答?.
通过 HTTP 加载图像
排球
Volley 也可用于 REST API,但由于需要更复杂的设置,我更喜欢使用上述 Square 的Retrofit。
假设您正在构建一个社交网络应用程序并想要加载朋友的个人资料图片。
文件build.gradle
将此行添加到您的模块级build.gradle文件中:
implementation 'com.android.volley:volley:1.0.0'
文件ImageFetch.java
Volley 比改造需要更多的设置。您将需要创建一个这样的类来设置 RequestQueue、ImageLoader 和 ImageCache,但这还不错:
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
将以下内容添加到布局 XML 文件以添加图像:
<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"/>
文件UserViewDialog.java
将以下代码添加到 onCreate 方法(Fragment、Activity)或构造函数(Dialog)中:
NetworkImageView profilePicture = view.findViewById(R.id.profile_picture);
profilePicture.setImageUrl("http://example.com/users/images/profile.jpg", ImageFetch.getImageLoader(getContext());
毕加索
Picasso是 Square 的另一个优秀图书馆。请参阅网站以获取一些很好的示例。