มีคำตอบที่ยอดเยี่ยมมากมายเกี่ยวกับคำถามนี้อยู่แล้ว แต่มีห้องสมุดดีๆมากมายออกมาตั้งแต่คำตอบเหล่านั้นถูกโพสต์ สิ่งนี้มีไว้เพื่อเป็นแนวทางสำหรับมือใหม่
ฉันจะครอบคลุมกรณีการใช้งานหลายอย่างสำหรับประสิทธิภาพการดำเนินงานของเครือข่ายและวิธีการแก้ปัญหาหรือสองสำหรับแต่ละ
ReST ผ่าน HTTP
โดยทั่วไป Json สามารถเป็น XML หรืออย่างอื่น
การเข้าถึง API แบบเต็ม
สมมติว่าคุณกำลังเขียนแอพที่ช่วยให้ผู้ใช้ติดตามราคาหุ้นอัตราดอกเบี้ยและอัตราแลกเปลี่ยน currecy คุณพบ Json API ที่มีลักษณะดังนี้:
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)
ชุดติดตั้งเพิ่มจาก Square
นี่เป็นตัวเลือกที่ยอดเยี่ยมสำหรับ API ที่มีจุดปลายหลายจุดและอนุญาตให้คุณประกาศจุดสิ้นสุดของ ReST แทนที่จะต้องเขียนโค้ดแยกต่างหากเช่นเดียวกับไลบรารีอื่น ๆ เช่น ion หรือ Volley (เว็บไซต์: http://square.github.io/retrofit/ )
คุณใช้กับการเงิน API ได้อย่างไร?
build.gradle
เพิ่มบรรทัดเหล่านี้ในโมดูลระดับ 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
FinancesApi.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);
}
FinancesApiBuilder
public class FinancesApiBuilder {
public static FinancesApi build(String baseUrl){
return new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.build()
.create(FinancesApi.class);
}
}
ตัวอย่างข้อมูลทางการเงิน
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 ทำให้เป็นเรื่องง่าย (ดูคำตอบที่ยอดเยี่ยมสำหรับรายละเอียด: https://stackoverflow.com/a/42899766/1024412 )
การเข้าถึง ReST API หนึ่งครั้ง
สมมติว่าคุณกำลังสร้างแอพ "mood weather" ที่ค้นหาตำแหน่ง GPS ของผู้ใช้และตรวจสอบอุณหภูมิปัจจุบันในพื้นที่นั้นและบอกอารมณ์ แอพประเภทนี้ไม่จำเป็นต้องประกาศจุดสิ้นสุดของ API มันแค่ต้องสามารถเข้าถึงจุดปลาย API ได้
ไอออน
นี่เป็นห้องสมุดที่ยอดเยี่ยมสำหรับการเข้าถึงประเภทนี้
โปรดอ่านคำตอบที่ยอดเยี่ยมของ msysmilu ( https://stackoverflow.com/a/28559884/1024412 )
โหลดภาพผ่าน HTTP
การระดมยิง
วอลเล่ย์ยังสามารถใช้สำหรับ ReST APIs ได้อีกด้วย แต่เนื่องจากจำเป็นต้องมีการติดตั้งที่ซับซ้อนมากขึ้นฉันต้องการใช้ Retrofit จาก Square ดังกล่าวข้างต้น ( http://square.github.io/retrofit/ )
สมมติว่าคุณกำลังสร้างแอปเครือข่ายสังคมและต้องการโหลดรูปโปรไฟล์ของเพื่อน
build.gradle
เพิ่มบรรทัดนี้ในโมดูลระดับ buid.gradle ของคุณ:
implementation 'com.android.volley:volley:1.0.0'
ImageFetch.java
วอลเล่ย์ต้องการการติดตั้งมากกว่า Retrofit คุณจะต้องสร้างคลาสเช่นนี้เพื่อตั้งค่า 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) หรือ Constructor (Dialog):
NetworkImageView profilePicture = view.findViewById(R.id.profile_picture);
profilePicture.setImageUrl("http://example.com/users/images/profile.jpg", ImageFetch.getImageLoader(getContext());
ปิกัสโซ
อีกห้องสมุดที่ยอดเยี่ยมจากสแควร์ โปรดดูเว็บไซต์สำหรับตัวอย่างที่ดี: http://square.github.io/picasso/