天天看點

Android/Java網絡加載架構Retrofit(一)初識

Android/Java網絡加載架構Retrofit(一)初識

Retrofit是Square針對Android網絡I/O設計的一套架構。Square官方介紹Retrofit:“A type-safe HTTP client for Android and Java”。Retrofit 2底層基于OkHttp實作,OkHttp依然是Square針對網絡請求設計的一整套解決方案。Retrofit是基于Okhttp的一套RESTful http網絡請求架構封裝。Retrofit在github上的開源項目位址是:https://github.com/square/retrofit  

給出一個Retrofit網絡加載簡例,該簡例實作一個簡單的功能,從一個網絡連結位址下載下傳一張圖檔設定到ImageView裡面。注意連結的拼接和注解使用。

上層Java代碼:

package zhangphil.http;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.ImageView;

import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.http.GET;
import retrofit2.http.Path;

public class MainActivity extends AppCompatActivity {
    private Call<ResponseBody> mCall;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final ImageView imageView = (ImageView) findViewById(R.id.image);

        Retrofit mRetrofit = new Retrofit.Builder()
                .baseUrl("https://www.baidu.com/")
                .build();

        MyRetrofitService mRetrofitService = mRetrofit.create(MyRetrofitService.class);

        mCall = mRetrofitService.getImagesByName("bd_logo1.png");
        Log.d("請求的網絡連結", String.valueOf(mCall.request().url()));

        mCall.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                try {
                    byte[] bytes = response.body().bytes();
                    Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);

                    imageView.setImageBitmap(bmp);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {
                t.printStackTrace();
            }
        });
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mCall.cancel();
    }

    private interface MyRetrofitService {
        @GET("img/{picName}")
        Call<ResponseBody> getImagesByName(@Path("picName") String picName);
    }
}
           

代碼運作結果logcat輸出:

10-16 11:21:29.685 6145-6145/zhangphil.http D/請求的網絡連結: https://www.baidu.com/img/bd_logo1.png           

不要忘記網絡權限:

<uses-permission android:name="android.permission.INTERNET"/>           

繼續閱讀