Android 네트워크 요청의 콜백

19695 단어 Android 학습
필요: 효율적으로 서버에 데이터를 요청하고 분석합니다.
관련된 주요 도구 클래스: HttpManager 형님 클래스.가장 중요한 클래스는 GET와 POST 방법을 봉인했다.모든 매개 변수는 이 종류를 거쳐 서버에 보내야 한다.HttpRequestListener 감청 인터페이스요청 상태와 파괴 방법 HttpRequestVo 메시지 클래스를 봉인했습니다.http 요청한 매개 변수를 봉인했습니다.JSONParser 해상도.
HttpRequestVo는 Http 요청에 포함된 매개변수를 봉인합니다.이 클래스는 하나의 통신 사자와 유사하여 메인 변조 함수에 값을 부여하여 HttpManager에 전달하고 후자가 이를 http 요청으로 가공하도록 한다.
public class HttpRequestVo {

    // 
    public String requestUrl;
    // 
    public Context context;
    // 
    public HashMap requestDataMap;
    //JSON 
    public JSONObject requestJson;
    //JSON 
    public JSONParser parser;
}

HttpRequestListener는 인터페이스로 몇 개의 Request의 반환 상태를 봉인하고 네트워크 요청의 결과 상태와 해석된 데이터 Object(일반적으로 HashMap)를 되돌리는 데 중요한 리셋 방법인 action이 있습니다.
public interface HttpRequestListener {

    public static final int BASE_EVENT = 0x100;

    // 
    public static final int EVENT_NO_NETWORK = BASE_EVENT + 1;
    // 
    public static final int EVENT_NETWORK_ERROR = BASE_EVENT + 2;
    // 
    public static final int EVENT_GET_DATA_ERROR = BASE_EVENT + 3;
    // 
    public static final int EVENT_GET_DATA_SUCCESS = BASE_EVENT + 4;

    /**
     *  
     *
     * @param actionCode  
     * @param object  
     */
    public abstract void action(int actionCode, Object object);

}

JSON Parser의 코드는 다음과 같습니다. 그 역할은 되돌아오는 네트워크 데이터를 JSON Object 형식으로 Bean으로 해석합니다.여기에서 Gson을 이용하여 데이터를 해석하는데 이런 장점은 코드 한 부만 쓰면 모든 유형의 JSON 데이터를 해석할 수 있다는 것이다. 예를 들어 뉴스를 얻으면 뉴스빈으로, 사용자를 얻으면 UserBean으로 해석할 수 있다.Parser 해상도는 하나밖에 없어서 코드의 복용성을 크게 향상시켰다.
public HashMap<String, Object> parseJSON(String paramString) throws JSONException {
    HashMap<String, Object> map = new HashMap<String, Object>();
    JSONObject jsonObject = new JSONObject(paramString);
    String result = jsonObject.getString("result");
     Gson gson = new Gson();
 map.put("datamap", gson.fromJson(result, cls));
    return map;

JavaBean의 형식은 다음과 같습니다. 목록에 저장된 요소는 하나의 모델입니다.Gson을 사용하면 반환된 데이터에 해당하는 필드를 Bean의 구성원으로 쉽게 해석할 수 있습니다.주의: 반환된 데이터의 필드 이름은 Bean의 변수 이름과 완전히 일치해야 합니다. 그렇지 않으면 해석에 성공할 수 없습니다.
public class NewsListEntity {

    public ArrayList newsList;

    public static class NewsModel {
        public int news_id;             
        public int news_type;          
        public String news_title;   
        public String news_sub;        
        public String news_content;   
        public String news_imgurl; 
        public int istop;
        public String news_time;                   

    }
}

- 주조용 함수의 사용 - 코드는 다음과 같다.주요 절차를 보여주었다: 1.패키지 요청 매개 변수 2.요청 함수를 호출하여 리셋 데이터 가져오기
protected void getNewsData(int type) {
        HttpRequestVo vo = new HttpRequestVo();
        vo.requestUrl = ConstantValues.GET_NEWS_LIST;
        vo.context = mContext;
        HashMap map = new HashMap();
        map.put("istop", "0");
        map.put("type", type + "");
        vo.requestDataMap = map;
        JSONObject requestJson = new JSONObject();  // 
        vo.parser = new JSONParser(NewsListEntity.class);
        vo.requestJson = requestJson;

        getDataFromServer(HttpManager.GET_METHOD, vo, new DataCallback>() {
            @Override
            public void onStart() {

            }

            @Override
            public void onFailed() {

            }

            /**
             *  news 
             * @param paramObject
             */
            @Override
            public void processData(HashMap paramObject) {

                NewsListEntity newsEntity = (NewsListEntity) paramObject.get("datamap");

                ArrayList newsList = newsEntity.newsList;

                mList.addAll(newsList);

                if (mListView.getAdapter() == null) {
                    mAdapter = new NewsItemAdapter(getContext(), mList);
                    mListView.setAdapter(mAdapter);
                } else {
                    mAdapter.notifyDataSetChanged();
                }
            }

            @Override
            public void onFinish() {
            }

        });

    }

다음은 리셋 인터페이스입니다.호출자 (일반적으로 Activity 또는 Fragment) 는 서버에 데이터를 요청할 때 이 인터페이스를 전송 매개 변수로 사용합니다.
public abstract interface DataCallback {
        public abstract void onStart();

        public abstract void onFailed();

        /**
         *  
         *
         * @param paramObject  
         */
        public abstract void processData(T paramObject);

        public abstract void onFinish();
    }

다음 코드는 리셋 인터페이스를 메인 디버그 함수에 적용하는 것을 보여 줍니다.getDataFromServer라는 주조용 함수는 세 가지 매개 변수가 있습니다. 첫 번째는 GET나 POST를 선택할 수 있습니다. 두 번째는 당신이 정의한 HttpRequestVo 요청체입니다. 세 번째는 위에서 언급한 리셋 함수입니다. 주조용 함수에서 그 안에 있는 방법을 실현하고 되돌아와 해석된 데이터를 사용합니다.
/**
     *  , 
     *
     * @param requestType
     * @param requestVo
     */
    protected void getDataFromServer(int requestType, HttpRequestVo requestVo, DataCallback callback) {
        final BaseHandler handler = new BaseHandler(mContext, callback);
        httpManager = new HttpManager(mContext, new HttpRequestListener() {
            @Override
            public void action(int actionCode, Object object) {
                Message msg = Message.obtain();
                switch (actionCode) {
                    case HttpRequestListener.EVENT_NO_NETWORK:
                        msg.what = HttpRequestListener.EVENT_NO_NETWORK;
                        break;
                    case HttpRequestListener.EVENT_NETWORK_ERROR:
                        msg.what = HttpRequestListener.EVENT_NETWORK_ERROR;
                        break;
                    case HttpRequestListener.EVENT_GET_DATA_ERROR:
                        msg.what = HttpRequestListener.EVENT_GET_DATA_ERROR;
                        msg.obj = null;
                        break;
                    case HttpRequestListener.EVENT_GET_DATA_SUCCESS:
                        msg.obj = object;
                        msg.what = HttpRequestListener.EVENT_GET_DATA_SUCCESS;
                        break;
                    default:
                        break;
                }
                handler.sendMessage(msg);
            }
        }, requestVo);
        callback.onStart();
        if (requestType == HttpManager.GET_METHOD) {
            /**
             *
             */
            httpManager.sendGetRequest();
        } else if (requestType == HttpManager.POST_METHOD) {
            /**
             *
             */
            httpManager.sendPostRequest();
        }
    }

다음은 GET 방법을 예로 들어 Http 요청을 보내는 방법을 살펴보겠습니다.앞부분은 HttpRequestVo의 매개 변수 맵을 훑어보고 URL의 문자열을 연결합니다.연결이 끝난 후, 여기에서 우리는 Volley를 사용하여 GET 요청을 보냅니다. 이렇게 하면 번거로운 HttpUrlConnection, 입력 출력 흐름 문장을 쓰지 않고 다른 라인을 열 필요가 없습니다. 왜냐하면 다중 라인 코드가 이미 봉인되어 있기 때문입니다.요청이 성공하면 리셋 함수의onsuccess 방법에서 두 가지 일을 해야 합니다:parser를 사용하여 요청한 JSON Object를 자바 대상으로 해석합니다.HttpRequestListener는 action 리셋 방법을 호출하여 분석 결과를 주 리셋용 함수인 getDataFrom Server에 전송합니다.
public void sendGetRequest() {
        requestStatus = 1;
        String urlStr = "";
        try {
            StringBuffer buffer = new StringBuffer();
            buffer.append(requestVo.requestUrl);
            if (requestVo.requestDataMap != null) {
                if (!buffer.toString().contains("?")) {
                    buffer.append("?");
                } else {
                    buffer.append("&");
                }
                HashMap map = requestVo.requestDataMap;
                int i = 1;
                int size = map.size();
                for (Map.Entry entry : map.entrySet()) {
                    if (i == size) {
                        if (TextUtils.isEmpty(entry.getValue())) {
                            buffer.append(entry.getKey() + "=");
                        } else {
                            buffer.append(entry.getKey() + "=" + requestEncodeStr(entry.getValue()));
                        }
                    } else {
                        if (TextUtils.isEmpty(entry.getValue())) {
                            buffer.append(entry.getKey() + "=" + "&");
                        } else {
                            buffer.append(entry.getKey() + "=" + requestEncodeStr(entry.getValue()) + "&");
                        }
                    }
                    i++;
                }
            }

            urlStr = buffer.toString();
            VolleyRequest.RequestGet(context, urlStr, "volleyGet",
                    new VolleyInterface(context, VolleyInterface.mListener, VolleyInterface.mErrorListener) {
                        @Override
                        public void onMySuccess(JSONObject result) {
                            if (result != null) {
                                try {
                                    if (requestVo.parser != null) {
                                        HashMap map = requestVo.parser.parseJSON(result.toString());
                                        listener.action(HttpRequestListener.EVENT_GET_DATA_SUCCESS, map);
                                    } else {
                                        listener.action(HttpRequestListener.EVENT_GET_DATA_SUCCESS, result);
                                    }

                                } catch (JSONException e) {
                                    e.printStackTrace();
                                }

                            }

                        }

                        @Override
                        public void onMyError(VolleyError error) {
                            listener.action(HttpRequestListener.EVENT_NETWORK_ERROR, null);
                            Log.i("TAG", error.toString());
                        }
                    });

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }

이로써 우리는 봉인된 자바빈을 얻었고, 나머지는 데이터를 UI에 보여주는 것이다.

좋은 웹페이지 즐겨찾기