noHttp 단순 실 용

48159 단어 기타
프레임 특성
Retrofit 보다 사용 이 더 간단 하고 사용 하기 쉽다.
  • 동적 설정 바 텀 프레임 워 크 는 OkHttp, HttpURLConnection
  • 입 니 다.
  • RxJava 와 완벽 하 게 결합 하여 비동기 요청 지원, 동기 요청 지원
  • 다 중 파일 업로드, 큰 파일 업로드 지원, 폼 제출 데이터
  • 파일 다운로드, 업로드, 다운로드 의 진도 리 셋, 오류 리 셋
  • JSon, xml, Map, List 의 제출 을 지원 합 니 다
  • 완벽 한 Http 캐 시 모드 로 데이터베이스, SD 카드 에 캐 시 를 지정 할 수 있 습 니 다. 캐 시 데 이 터 는 안전하게 암호 화 되 었 습 니 다.
  • 6.0 이상 의 핸드폰 이 SD 카드 에 캐 시 될 때 실행 을 요청 할 때 권한: AndPermission
  • 사용자 정의 요청, JSonObject, JavaBean 등 직접 요청
  • 쿠키 의 자동 유지, 앱 재 부팅, 꺼 진 후에 도 지속 유지
  • http 301 302 303 304 307 리 셋, 다 중 플러그 리 셋 지원
  • Https, 자체 서명 사이트 Https 의 방문, 양 방향 인증 지원
  • 실패 재 시도 메커니즘, 요청 우선 순위 지원
  • GET, POST, PUT, PATCH, HEAD, DELETE, OPTIONS, TRACE 등 요청 협의
  • 대기 열 로 요청 을 저장 하고 다 중 스 레 드 자원 을 평균 적 으로 분배 하 며 여러 요청 의 동시 다발 을 지원 합 니 다
  • 특정한 요청 취소, 지정 한 여러 요청 취소, 모든 요청 취소 지원
  • 사용 방법
    AndroidStudio 사용 방법
  • HttpURLConnection 을 네트워크 계층 으로 사용 하면:
  • compile 'com.yolanda.nohttp:nohttp:1.1.0'
  • 네트워크 계층 으로 OkHttp 를 사용 하려 면 다시 의존 하 십시오.
  • compile 'com.yanzhenjie.nohttp:okhttp:1.1.0'

    Eclipse 사용법
  • HttpURLConnection 을 네트워크 계층 으로 사용 하면:
  • nohttp jar 패키지 다운로드
  • OkHttp 를 네트워크 층 으로 사용 하면
  • nohttp jar 패키지 다운로드: nohttp 원생 jar.
  • nohttp - okhttp jar 패키지 다운로드: nohttp 와 okhttp 과도, 두 가지 종류 만 있 습 니 다.
  • okhttp jar 패키지 다운로드: okhttp 원생 jar.
  • okhttp - url jar 패키지 다운로드: okhttp 와 URLConnection 의 과도 함.
  • okio jar 가방 다운로드: okio 가방.

  • jar 가 많 군요. 그래서 강력 한 999 차방 에서 사용 하지 않 은 AndroidStudio 학생 들 에 게 빨리 전환 하 라 고 권 했 습 니 다.

  • 초기 화
    NoHttp 초기 화 는 Context 가 필요 합 니 다. Application onCreate() 에서 초기 화 하 는 것 이 좋 습 니 다. manifest.xml 에 등록 Application 하 는 것 을 기억 하 세 요.
    일반 초기 화
    직접 초기 화 후 모든 것 은 기본 설정 을 사용 합 니 다.
    NoHttp.initialize(this);

    고급 사용자 정의 초기 화
  • 시간 초과 설정, 기본 10s
  • NoHttp.initialize(this, new NoHttp.Config()
        //           ,    
        .setConnectTimeout(30 * 1000)
        //              ,    
        .setReadTimeout(30 * 1000)
    );
  • 캐 시 설정, 기본 데이터베이스 에 저장
  • NoHttp.initialize(this, new NoHttp.Config()
        ...
        //       
        .setCacheStore(
            new DBCacheStore(this).setEnable(true) //        ,  false  。
        )
        //      SD 
        .setCacheStore(
            new DiskCacheStore(this)
        )
    );
  • 쿠키 가 저 장 된 위 치 를 설정 하고 기본 값 은 데이터베이스 에 저 장 됩 니 다
  • NoHttp.initialize(this, new NoHttp.Config()
        ...
        //        DBCookieStore,         。
        .setCookieStore(
            new DBCookieStore(this).setEnable(false) //      cookie,  false  。
        )
    );
  • 네트워크 계층 설정
  • NoHttp.initialize(this, new NoHttp.Config()
        ...
        //   HttpURLConnection
        .setNetworkExecutor(new URLConnectionNetworkExecutor())
        //   OkHttp
        .setNetworkExecutor(new OkHttpNetworkExecutor())
    );

    필요 한 권한
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

    우호 적 인 디 버 깅 모드
    Logger.setDebug(true);//   NoHttp     ,           、       。
    Logger.setTag("NoHttpSample");//   NoHttp  Log tag。

    NoHttp 디 버 깅 모드 를 켜 면 요청 과정, 로그, 오류 정 보 를 볼 수 있 습 니 다. 기본적으로 스냅 백 을 사용 하지 않 습 니 다.요청 헤더, 요청 데이터, 응답 헤더, 쿠키 등 을 볼 수 있 고 인쇄 된 로그 가 매우 가지런 하 다.
    그 러 니까 만약 에 사용 하 는 과정 에서 무슨 문제 가 생기 면 디 버 깅 모드 를 켜 면 모든 요괴 가 나타 날 것 이다.
    제3자 비동기 프레임 워 크
    RxJava RxJava, RxAndroid, RxBus, EventBus 등 제3자 비동기 작업 프레임 워 크 와 완벽 하 게 결합 하여 사용 할 수 있 으 며, 여기 서 demo 에서 RxJava 와 함께 사용 하 는 코드 를 제시 합 니 다.구체 적 인 패 키 징 은 데모 의 RxNoHttp 를 참고 하 세 요.
    Request<UserInfo> request = new JavaBeanRequest<>(url, UserInfo.class);
    RxNoHttp.request(this, request, new SimpleSubscriber<Response<UserInfo>>() {
        @Override
        public void onNext(Response<YanZhenjie> entityResponse) {
            //         
            UserInfo userInfo = entiryResponse.get();
        }
    });

    요청 대기 열
    RequestQueue requestQueue = NoHttp.newRequestQueue();
    //         ,      :NoHttp.newRequestQueue(3);
    
    //     
    requestQueue.add(what, request, responseListener);
  • 대기 열 에 요청 을 추가 할 때 what 가 있 습 니 다. 이 what 는 responseLisetener 응답 할 때 개발 자 에 게 되 돌려 주기 때문에 개발 자 는 하나의 responseLisetener 로 여러 요청 의 응답 을 받 아들 이 고 what 로 결 과 를 구분 할 수 있 습 니 다.어떤 프레임 워 크 처럼 모든 요청 은 new callback 이 필요 하지 않 습 니 다.
  • 생 성 대기 열 을 게으름뱅이 단일 모드 로 쓰 는 것 을 강력 히 권장 합 니 다. 새 대기 열 마다 new 에서 해당 하 는 스 레 드 가 나 오 는 동시에 스 레 드 수가 고정 되 어야 대기 열의 역할 이 가장 큽 니 다.

  • 요청 형식
    String 요청
    Request<String> request = NoHttp.createStringRequest(url, RequestMethod.GET);
    requestQueue.add(0, request, listener);

    제 이 슨 요청
    // JsonObject
    Request<JSONObject> objRequest = NoHttp.createJsonObjectRequest(url, RequestMethod.POST);
    requestQueue.add(0, objRequest, listener);
    
    // JsonArray
    Request<JSONArray> arrayRequest = NoHttp.createJsonArrayRequest(url, RequestMethod.PUT);
    requestQueue.add(0, arrayRequest, listener);

    비트 맵 요청
    Request<Bitmap> request = NoHttp.createImageRequest(url, RequestMethod.DELETE);
    requestQueue.add(0, request, listener);

    FastJSon 과 Gson 을 요청 합 니 다.
    // FastJson
    Request<JSONObject> request = new FastJsonRequest(url, RequestMethod.POST);
    requestQueue.add(0, request, listener);

    자바 빈 직접 요청
    //     Gson、FastJson   JavaBean
    Request<UserInfo> request = new JavaBeanRequest(url, RequestMethod.GET);
    requestQueue.add(0, request, listener);

    매개 변수 추가
    Request<JSONObject> request = new JavaBeanRequest(url, RequestMethod.POST);
       .add("name", "yoldada") // String  
       .add("age", 18) // int  
       .add("sex", '0') // char  
       .add("time", 16346468473154) // long  
    
       //   Bitmap
       .add("head", new BitmapBinary(bitmap))
       //   File
       .add("head", new FileBinary(file))
       //   ByteArray
       .add("head", new ByteArrayBinary(byte[]))
       //   InputStream
       .add("head", new InputStreamBinary(inputStream));

    파일 업 로드 는 http 폼 의 표준 협 의 를 실현 하여 많은 개발 자의 수 요 를 만족 시 켰 습 니 다. 다음 과 같은 몇 가지 형식 이 있 습 니 다.
  • 단일 파일
  • Request<String> request = ...
    request.add("file", new FileBinary(file));
  • 여러 개의 파일 을 업로드 하고 여러 개의 Key 여러 개의 파일 형식 을 업로드 합 니 다. 여기에 여러 가지 형식의 파일 을 추가 할 수 있 습 니 다. File, Bitmap, InputStream, ByteArray.
  • Request<String> request = ...
    request.add("file1", new FileBinary(File));
    request.add("file2", new FileBinary(File));
    request.add("file3", new InputStreamBinary(InputStream));
    request.add("file4", new ByteArrayBinary(byte[]));
    request.add("file5", new BitmapBinary(Bitmap));
  • 여러 개의 파일 을 업로드 하고 하나의 Key 여러 개의 파일 형식
  • Request<String> request = ...
    fileList.add("image", new FileBinary(File));
    fileList.add("image", new InputStreamBinary(InputStream));
    fileList.add("image", new ByteArrayBinary(byte[]));
    fileList.add("image", new BitmapBinary(Bitmap));

    또는:
    Request<String> request = ...
    
    List<Binary> fileList = ...
    fileList.add(new FileBinary(File));
    fileList.add(new InputStreamBinary(InputStream));
    fileList.add(new ByteArrayBinary(byte[]));
    fileList.add(new BitmapStreamBinary(Bitmap));
    request.add("file_list", fileList);

    제출 요청 패키지
    제출 바디 는 제출 JSon, 제출 String, 제출 Xml, 커 뮤 니 케 이 션 등 으로 나 뉘 는데 구체 적 인 용법 은 다음 과 같다.
    //     String
    request.setDefineRequestBody(String, ContentType);
    
    //   json   
    request.setDefineRequestBodyForJson(JsonString)
    
    //   jsonObject  ,    json   
    request.setDefineRequestBodyForJson(JSONObject)
    
    //   xml   
    request.setDefineRequestBodyForXML(XmlString)
    
    //     Body,  File(          ),    InputStream   
    request.setDefineRequestBody(InputStream, ContentType)

    동기 화 요청
    현재 스 레 드 에서 요청 합 니 다. 스 레 드 에서 이렇게 사용 합 니 다.
    Request<String> request = NoHttp.createStringRequest(url, RequestMethod.DELETE);
    Response<String> response = NoHttp.startRequestSync(request);
    if (response.isSucceed()) {
        //     
    } else {
        //     
    }

    5 대 캐 시 모드
    NoHttp 의 캐 시 는 매우 강력 합 니 다. 캐 시 를 데이터베이스 로, SD 카드 로 바 꾸 는 것 을 지원 합 니 다. 또한 캐 시 를 데이터베이스 나 SD 에 상 관 없 이 NoHttp 는 데 이 터 를 암호 화 했 습 니 다. 초기 화 할 때 캐 시 위 치 를 설정 해 야 합 니 다.
    주의해 야 할 것 은 6.0 이상 의 휴대 전화 에서 SD 카드 에 캐 시 하려 면 요청 하기 전에 실행 요청 시 권한 이 필요 하 며, 실행 권한 을 모 르 면 이 항목 을 볼 수 있 습 니 다: AndPermission.
    NoHttp.initialize(this, new NoHttp.Config()
        ...
        //       
        .setCacheStore(
            new DBCacheStore(this).setEnable(true) //        ,  false  。
        )
        //      SD 
        .setCacheStore(
            new DiskCacheStore(this)
        )
    );
  • 1. Default 모드 는 http 304 리 셋 캐 시 NoHttp 자체 가 RFC 2616 을 실 현 했 기 때문에 DEFAULT 로 설정 하거나 설정 하지 않 아 도 됩 니 다.
  • Request<JSONObject> request = NoHttp.createJsonObjectRequest(url);
    request.setCacheMode(CacheMode.DEFAULT);
  • 2. 요청 서버 가 실 패 했 을 때 캐 시 요청 서버 를 읽 는 데 성공 하면 서버 데 이 터 를 되 돌려 주 고 요청 서버 가 실패 하면 캐 시 데 이 터 를 읽 고 되 돌려 줍 니 다.
  • Request<JSONObject> request = NoHttp.createJsonObjectRequest(url);
    request.setCacheMode(CacheMode.REQUEST_NETWORK_FAILED_READ_CACHE);
  • 3. 캐 시가 있 으 면 바로 성공 하고 캐 시가 없 으 면 서버 에 요청 합 니 다. ImageLoader 의 핵심 은 메모리 최적화 외 에 나머지 하 나 는 내부 에 그림 이 있 으 면 직접 사용 하고 없 으 면 서버 에 요청 하 는 것 을 발견 하기 때문에 NoHttp 는 ImageLoader 로 사용 합 니 다.

  • 요청 String, 캐 시 String:
    Request<JSONObject> request = NoHttp.createJsonObjectRequest(url);
    //    Http  ,       IF_NONE_CACHE_REQUEST_NETWORK
    request.setCacheMode(CacheMode.IF_NONE_CACHE_REQUEST_NETWORK);

    요청 그림, 캐 시 그림:
    Request<Bitmap> request = NoHttp.createImageRequest(imageUrl);
    request.setCacheMode(CacheMode.IF_NONE_CACHE_REQUEST_NETWORK);
  • 4. 네트워크 만 요청 하면 캐 시 를 읽 지 않 고 Http 304 도 지원 하지 않 습 니 다.
  • Request<Bitmap> request = NoHttp.createImageRequest(imageUrl);
    request.setCacheMode(CacheMode.ONLY_REQUEST_NETWORK);
    ...
  • 5. 캐 시 만 읽 고 캐 시 만 읽 으 며 네트워크 와 다른 작업 을 요청 하지 않 습 니 다.
  • Request<Bitmap> request = NoHttp.createImageRequest(imageUrl);
    request.setCacheMode(CacheMode.ONLY_READ_CACHE);

    파일 다운로드
    다운로드 파일 코드 가 많 기 때문에 관건 적 인 부분 을 붙 입 니 다. 구체 적 인 것 은 demo 를 참고 하 십시오.
    파일 다운로드 도 대기 열 입 니 다. 대기 열 은 처음에 요청 한 대기 열 과 같 습 니 다.
  • 다운로드 요청
  • //    
    downloadRequest = NoHttp.createDownloadRequest...
    // what     
    // downloadRequest       
    // downloadListener     
    downloadQueue.add(0, downloadRequest, downloadListener);
  • 다운 로드 를 일시 정지 하거나 정지
  • downloadRequest.cancel();
  • 다운로드 과정 감청
  • private DownloadListener downloadListener = new DownloadListener() {
        @Override
        public void onStart(int what, boolean resume, long preLenght, Headers header, long count) {
            //     
        }
    
        @Override
        public void onProgress(int what, int progress, long downCount) {
            //       
        }
    
        @Override
        public void onFinish(int what, String filePath) {
            //     
        }
    
        @Override
        public void onDownloadError(int what, StatusCode code, CharSequence message) {
            //       
        }
    
        @Override
        public void onCancel(int what) {
            //          
        }
    };

    취소 요청
    NoHttp 는 어떤 요청 을 취소 하고 여러 요청 을 취소 하 며 모든 요청 을 취소 하 는 것 을 지원 합 니 다.
  • 요청 대상 을 직접 호출 하 는 cancel 방법 을 취소 합 니 다.
  • request.cancel();
  • 대기 열 에서 지정 한 요청 을 취소 합 니 다. 요청 하기 전에 set 에 sign 을 요청 합 니 다. 취소 할 때 대기 열 을 호출 하 는 cancelBySign 은 이 sign 을 지정 한 모든 요청 을 취소 할 수 있 습 니 다.
  • request1.setCancelSign(sign);
    request2.setCancelSign(sign);
    ...
    
    //         sign     
    queue.cancelBySign(sign);
  • 대기 열 에 있 는 모든 요청 취소
  • queue.cancelAll();

    대기 열 정지
    대기 열 이 멈 춘 후에 요청 을 대기 열 에 추가 하면 요청 이 실행 되 지 않 습 니 다.
    RequestQueue queue = NoHttp.newRequestQueue();
    ...
    
    queue.stop();

    사용자 정의 요청
    NoHttp 의 모든 자체 요청 은 계승 RestRequest 클래스 이기 때문에 사용자 정의 요청 도 계승 RestRequest 해 야 합 니 다. 요청 하고 자 하 는 데이터 형식 을 범용 으로 쓰 고 마지막 으로 parseResponse() 방법 에서 서버 데 이 터 를 원 하 는 데이터 형식 으로 분석 하면 됩 니 다.
  • FastJsonRequest
  • public class FastJsonRequest extends RestRequestor<JSONObject> {
    
        public FastJsonRequest(String url) {
            this(url, RequestMethod.GET);
        }
    
        public FastJsonRequest(String url, RequestMethod requestMethod) {
            super(url, requestMethod);
        }
    
        @Override
        public JSONObject parseResponse(Headers header, byte[] body) throws Throwable {
            String result = StringRequest.parseResponseString(headers, body);
            return JSON.parseObject(result);
        }
    }
  • JavaBean Request, FastJSon, Gson 등 을 이용 하여 데 이 터 를 JavaBean
  • 으로 직접 변환 합 니 다.
    public class JavaBeanRequest extends RestRequest<T> {
        private Class<T> clazz;
    
        public JavaBeanRequest(String url, Class<T> clazz) {
            this(url, RequestMethod.GET, clazz);
        }
    
        public JavaBeanRequest(String url, RequestMethod requestMethod, Class<T> clazz) {
            super(url, requestMethod);
            this.clazz = clazz;
        }
    
        @Override
        public T parseResponse(Headers header, byte[] body) throws Throwable {
            String response = StringRequest.parseResponseString(header, body);
    
            //           ,      ,             ParseError   。
            return JSON.parseObject(response, clazz);
        }
    }
  • 사용자 정의 요청 사용
  • //   FastJson     
    Request<JSONObject> request = new FastJsonRequest(url, requestMethod);
    queue.add(what, mRequest, listener);
    
    ...
    
    //     JavaBean
    Request<UserInfo> request = new JavaBeanRequest(url, UserInfo.class);
    queue.add(what, request, listener);

    코드 혼동
    NoHttp 는 고 버 전 시스템 을 호 환 하 는 api 에 반사 호출 을 사용 하도록 설계 되 었 기 때문에 모든 클래스 가 혼 동 될 수 있 습 니 다. 굳이 keep 를 원 하지 않 는 다 면 다음 설정 을 사용 하면 됩 니 다.
  • 원생 NoHttp 혼동
  • -dontwarn com.yolanda.nohttp.**
    -keep class com.yolanda.nohttp.**{*;}
    
  • okhttp 버 전 을 사용 하면
  • // nohttp
    -dontwarn com.yolanda.nohttp.**
    -keep class com.yolanda.nohttp.**{*;}
    
    // nohttp-okhttp
    -dontwarn com.yanzhenjie.nohttp.**
    -keep class com.yanzhenjie.nohttp.**{*;}
    
    // okhttp
    -dontwarn okhttp3.**
    -keep class okhttp3.** { *;} 
    -dontwarn okio.**
    -keep class okio.** { *;} 

    좋은 웹페이지 즐겨찾기