Retrofit 초기 접촉

7493 단어

인용문


최근의 한 항목에서는 요즘 핫한 레트로핏을 사용했는데 처음 접했을 때 간단하게 사용했다.요청 인터페이스가 필요한 곳에 방법을 정의하고 방법체에 Retrofit 관련 코드를 쓰기 때문에 기본적으로 요청 인터페이스가 필요한 곳마다 이렇게 해야 한다.이렇게 한 결과는 후기에 다시 이 코드들을 돌이켜 볼 때 종류가 매우 어지럽고 코드가 불필요해서 유지하기 어렵다는 것이다.그래서 저는 간단한 봉투를 만들었습니다. 한 신의 가르침을 받은 후에 (이 봉투는 MVP 맛이 나고 속마음은 조금 즐겁다고 합니다) 정리된 코드를 여기에 붙여서 여러분께 공유합니다.부족한 점이 있으면 많이 지적해 주시고 댓글에 적극적으로 댓글을 달아서 토론해 주시기 바랍니다.저도 벽돌을 던져 옥을 끌어올리는 행동입니다. 만약에 어떤 대신이 좋은 사용 방법을 가지고 있다면 이 자리에서 여러분에게 공유하고 함께 공부하며 함께 진보하는 것을 환영합니다. 감사합니다!
일반적으로 우리가 Retrofit를 사용하는 데 없어서는 안 될 것은 바로interface를 정의하는 것이다. 그 안에 Call을 가져오는 방법을 정의하는 것이다.이전에는 모두 랜덤 건축으로 거의 모든 종류에 하나가 있었다.이제 나는 그것을 꺼냈다. 공통인터페이스로서 인터페이스에 필요한 콜을 가져오는 방법을 적어 놓았다.
public interface Parser {

/**
 *       
 *
 * @param mParams
 * @return
 */
@FormUrlEncoded
@POST("surfers")
Call doParserSurferEntry(@FieldMap Map mParams);

/**
 *       
 *
 * @param params
 * @return
 */
@GET("articles")
Call doGetArticles(@QueryMap Map params);
}

이 단계가 끝나면 Retrofit를 만들어서 인터페이스를 요청하고 데이터를 가져올 것입니다.여기에서 저도 이 조작을 하나의 공공 클래스에 놓았습니다. 그러면 우리는 한 번만 만들면 됩니다. 곳곳에서 한 번씩 만들 필요가 없습니다.
public class EntryDataParser {

private Context mContext;
private Parser mParser;
private Map mParams;
private int DATA_TYPE;
private EntryDataListener mListener;

public EntryDataParser(Context mContext, EntryDataListener mListener) {
    this.mContext = mContext;
    this.mListener = mListener;
}

/**
 *     ,      
 *
 * @param DATA_TYPE     
 * @param mParams       
 */
public void doParser(int DATA_TYPE, Map mParams) {
    this.DATA_TYPE = DATA_TYPE;
    this.mParams = mParams;
    Retrofit retrofit = new Retrofit.Builder().baseUrl(ConstantUtil.BASE_URL)
            .addConverterFactory(GsonConverterFactory.create()).build();
    mParser = retrofit.create(Parser.class);
    switch (DATA_TYPE) {
        case ParserEntry.SURFER_TYPE://      
            doCreateSurfer();
            break;

        case ParserEntry.ARTICLE_TYPE://      
            doGetArticles();
            break;
    }
}

/**
 *       
 */
private void doCreateSurfer() {
    Call call = mParser.doCreateSurfer(mParams);
    call.enqueue(new Callback() {
        @Override
        public void onResponse(Call call, Response response) {
            if (response.isSuccessful()) {
                if (response.body().code == 200) {
                    mListener.doEntryData(DATA_TYPE, response.body());
                } else {
                    PrintUtil.toast(mContext, response.body().msg);
                }
            } else {
                PrintUtil.i("        : response is unsuccessful");
            }
        }

        @Override
        public void onFailure(Call call, Throwable t) {
            PrintUtil.i("        : " + t.getMessage());
        }
    });
}

/**
 * CommonTestActivity.java
 *       
 */
private void doGetArticles() {
    Call call = mParser.doGetArticles(mParams);
    call.enqueue(new Callback() {
        @Override
        public void onResponse(Call call, Response response) {
            if (response.isSuccessful()) {
                if (response.body().code == 200) {
                    mListener.doEntryData(DATA_TYPE, response.body());
                } else {
                    PrintUtil.toast(mContext, response.body().msg);
                }
            } else {
                PrintUtil.i("        : response is unsuccessful");
            }
        }

        @Override
        public void onFailure(Call call, Throwable t) {
            PrintUtil.i("        : " + t.getMessage());
        }
    });
}
}

각 변수 설명: Context mContext;상하문으로 해석이 많지 않다.Parser mParser; Call을 가져오는 데 사용되는 공공 인터페이스Map mParams; 인터페이스에 필요한 매개 변수를 요청하는 것이다.int DATA_TYPE; 이 매개 변수는 당신이 어떤 조작을 해야 하는지 구분하는 데 사용됩니다. 예를 들어 관광객 신분을 추가하고 글 목록을 가져오는 데 사용되며, 구분하는 tag를 전송해야 합니다.EntryDataListener mListener; 이 매개 변수는 인터페이스에서 되돌아오는 데이터가 Gson을 통해 해석된 실체 클래스를 리셋하는 데 사용되며, 뒤에 정의가 있을 것이다.
public class ParserEntry {

//      
public static final int SURFER_TYPE = 0;

//      
public static final int ARTICLE_TYPE = 1;
}

Parser Entry 클래스, 이 클래스는 위의 Entry DataParser 클래스에서doParser () 방법 안의 switch () 에 대응하는 DATA 를 정의합니다.TYPE, 네가 무슨 조작을 하려는지 구분해 봐.
public class ParserData {

private Context mContext;
private EntryDataParser parser;

public ParserData(Context mContext, EntryDataListener mListener) {
    this.mContext = mContext;
    this.parser = new EntryDataParser(mContext, mListener);
}

/**
 *       
 */
public void doCreateSurfer() {
    Map params = new HashMap<>();
    params.put("deviceId", DeviceUtil.doGetIMEI(mContext));
    parser.doParser(ParserEntry.SURFER_TYPE, params);
}

/**
 *       
 */
public void doGetArticles() {
    Map params = new HashMap<>();
    params.put("user", "surfer");
    params.put("fromUid", ShareSaveUtil.doGetSurferId(mContext));
    params.put("flag", "index2");
    params.put("page", String.valueOf(1));
    params.put("limit", ConstantUtil.COMMON_LIMIT);
    parser.doParser(ParserEntry.ARTICLE_TYPE, params);
}
}

ParserData 클래스는 특정 인터페이스의 요청 동작을 실현하기 위해 필요한 파라미터를 추가합니다.
마지막으로Activity에서 호출하여 인터페이스 데이터의 획득을 실현하고 인터페이스를 채웁니다.
public class CommonTestActivity extends Activity implements EntryDataListener {

private TextView show;
private ParserData data;
private SurferEntry surferEntry;
private RecommendEntry recommendEntry;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_common_test);
    init();
    showView();
}

/**
 *    
 */
private void init() {
    show = findViewById(R.id.text_show);
    data = new ParserData(this, this);
    surferEntry = new SurferEntry();
    recommendEntry = new RecommendEntry();
}

/**
 *   UI
 */
private void showView() {
    data.doCreateSurfer();//      
}

/**
 *        
 *
 * @param DATA_TYPE      
 */
@Override
public void doEntryData(int DATA_TYPE, Object mObject) {
    switch (DATA_TYPE) {
        case ParserEntry.SURFER_TYPE:
            surferEntry = (SurferEntry) mObject;
            data.doGetArticles();//      
            break;

        case ParserEntry.ARTICLE_TYPE:
            recommendEntry = (RecommendEntry) mObject;
            show.setText(surferEntry.toString() + "

" + recommendEntry.toString()); break; } } }

여기서 SurferEntry와 RecommendEntry는 모두 인터페이스 데이터의 실체 클래스로 상황을 보고 스스로 정의한다.여기까지, 포장 사용이 완료되었습니다.

끝말


이 물건을 만든 후에도 자신의 마음은 약간 기뻤다. 결합도가 많이 낮아졌고,Activity층도 많이 간결해 보였기 때문이다.그러나 처음에는 정적 방법과 정적 변수를 사용했고 신의 조언을 받아 이렇게 하면 메모리 유출이 쉽다는 것을 알게 되었다.그래서 지금처럼 바꿨어요. 제가 코드를 쓴 이래로 아주 성취감 있는 일을 한 것 같아요. 하하하, 스스로 기뻐하세요.여기서 여러분께 공유해 드리자면 첫째는 Retrofit를 편리하게 사용할 수 있도록 하기 위해서입니다. 둘째는 여러분이 보시고 나서 어디가 개선될 것 같으면 댓글에 적극적으로 댓글을 남기고 많이 가르쳐 주십시오. 저도 발전을 기대하고 있으니까요. 헤헤.감사합니다!

좋은 웹페이지 즐겨찾기