안드로이드 오픈소스 프레임워크 Afinal 2편-포정해우, 심층 조사

14357 단어 android
---컨텐츠 복원 시작 --
아니면 계속FinalHttp, 이런 종류에 관련된 것이 여전히 매우 많다.
1: 스레드 풀
일단 FinalHttp 클래스에 스레드 풀과 관련된 두 개의 정적 클래스가 있는 걸 봤어요.
private static final ThreadFactory  sThreadFactory = new ThreadFactory() {
        private final AtomicInteger mCount = new AtomicInteger(1);
        public Thread newThread(Runnable r) {
            Thread tread = new Thread(r, "FinalHttp #" + mCount.getAndIncrement());
            tread.setPriority(Thread.NORM_PRIORITY - 1);
            return tread;
        }
    };
    
    private static final Executor executor =Executors.newFixedThreadPool(httpThreadCount, sThreadFactory);

ThreadFactory는 공장 모드이고, 아래는 스레드 탱크 Executor입니다.스레드 탱크에서 new에서 나온 스레드는 모두 이 ThreadFactory에서 부화한 스레드로 원시 정보를 부여한 스레드 이름은 모두FinalHttp#n이다. (이곳에는 AtomicInteger가 하나 더 있는데 이것은 원자 조작류로 주로 높은 병발 환경에서 효율적인 프로그램 처리에 사용된다. 비저항 알고리즘을 사용하여 병발 제어를 실현한다.)그리고 라인 우선 순위를 설정합니다.
이 클래스 안의 많은 방법들이 이 Executor 스레드 탱크를 전달하는 것을 보았는데 한 스레드를 실행하지 못하면 모두 executor가 스레드 탱크에 가입하여 실행하는 것이라고 생각합니다. 이런 스레드 관리는 비교적 효율적이고 훌륭합니다.
구조 방법
이 구조 방법은 기본 설정이 너무 많은데, 알이 아프면 쌀이 있습니까?
 public FinalHttp() {
        BasicHttpParams httpParams = new BasicHttpParams();

        ConnManagerParams.setTimeout(httpParams, socketTimeout);
        ConnManagerParams.setMaxConnectionsPerRoute(httpParams, new ConnPerRouteBean(maxConnections));
        ConnManagerParams.setMaxTotalConnections(httpParams, 10);

        HttpConnectionParams.setSoTimeout(httpParams, socketTimeout);
        HttpConnectionParams.setConnectionTimeout(httpParams, socketTimeout);
        HttpConnectionParams.setTcpNoDelay(httpParams, true);
        HttpConnectionParams.setSocketBufferSize(httpParams, DEFAULT_SOCKET_BUFFER_SIZE);

        HttpProtocolParams.setVersion(httpParams, HttpVersion.HTTP_1_1);

        SchemeRegistry schemeRegistry = new SchemeRegistry();
        schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
        schemeRegistry.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));
        ThreadSafeClientConnManager cm = new ThreadSafeClientConnManager(httpParams, schemeRegistry);

        httpContext = new SyncBasicHttpContext(new BasicHttpContext());
        httpClient = new DefaultHttpClient(cm, httpParams);
        httpClient.addRequestInterceptor(new HttpRequestInterceptor() {
            public void process(HttpRequest request, HttpContext context) {
                if (!request.containsHeader(HEADER_ACCEPT_ENCODING)) {
                    request.addHeader(HEADER_ACCEPT_ENCODING, ENCODING_GZIP);
                }
                for (String header : clientHeaderMap.keySet()) {
                    request.addHeader(header, clientHeaderMap.get(header));
                }
            }
        });

        httpClient.addResponseInterceptor(new HttpResponseInterceptor() {
            public void process(HttpResponse response, HttpContext context) {
                final HttpEntity entity = response.getEntity();
                if (entity == null) {
                    return;
                }
                final Header encoding = entity.getContentEncoding();
                if (encoding != null) {
                    for (HeaderElement element : encoding.getElements()) {
                        if (element.getName().equalsIgnoreCase(ENCODING_GZIP)) {
                            response.setEntity(new InflatingEntity(response.getEntity()));
                            break;
                        }
                    }
                }
            }
        });

        httpClient.setHttpRequestRetryHandler(new RetryHandler(maxRetries));

        clientHeaderMap = new HashMap<String, String>();
        
    }

Params는 네트워크 링크 설정 클래스입니다. 예를 들어 최대 연결 수 설정, 루트 최대 연결 수, 읽기 시간 초과, 연결 시간 초과, 플러그인 버퍼 크기 등입니다.이곳의 연결 수는 모두 10회, 슈퍼마켓 시간은 모두 10초이다. 사실 이렇게 하면 원래 일종의 인터넷 요청 임무의 지연이다.그 다음 반복 횟수가 5번인데 네트워크가 좋지 않으면 5번을 다시 시도해야 할 수도 있어 상부의 UI 상호작용에 심각한 영향을 미쳤다.그러나 하이라이트는 g-zip이다. Gzip이 켜지면 출력된 데이터를 압축 처리하여 네트워크를 통해 전송되는 데이터량을 줄이고 읽는 속도를 높일 수 있다.
 
3:AfinalHttp의 방법
1. 구성 방법:
public void configCharset(String charSet){
        if(charSet!=null && charSet.trim().length()!=0)
            this.charset = charSet;
    }

    public void configCookieStore(CookieStore cookieStore) {
        httpContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);
    }


    public void configUserAgent(String userAgent) {
        HttpProtocolParams.setUserAgent(this.httpClient.getParams(), userAgent);
    }
    

    /**
     *           ,   10  
     * @param timeout
     */
    public void configTimeout(int timeout){
        final HttpParams httpParams = this.httpClient.getParams();
        ConnManagerParams.setTimeout(httpParams, timeout);
        HttpConnectionParams.setSoTimeout(httpParams, timeout);
        HttpConnectionParams.setConnectionTimeout(httpParams, timeout);
    }

    /**
     *   https       SSLSocketFactory
     * @param sslSocketFactory
     */
    public void configSSLSocketFactory(SSLSocketFactory sslSocketFactory) {
        Scheme scheme = new Scheme("https", sslSocketFactory, 443);
        this.httpClient.getConnectionManager().getSchemeRegistry().register(scheme);
    }
    
    /**
     *         
     * @param retry
     */
    public void configRequestExecutionRetryCount(int count){
        this.httpClient.setHttpRequestRetryHandler(new RetryHandler(count));
    }

이 설정들은 모두 요청을 하기 전에 실행해야 하는데 시간 초과를 설정하는 방법은 너무 막무가내이다. 세 가지 시간 초과가 모두 10s라는 것은 세 가지 시간 초과를 합치면 30s, 30분이 걸릴 수 있다는 것을 의미하는 것이 아니냐!
2. 요청 방법 입구, 자주 사용하는 get() 방법,post() 방법,download() 파일 다운로드 방법은 여러 가지 재부팅이 필요합니다.
그 재부팅 방법은 붙이지 않습니다. 모두 HttpHandler 클래스로 처리됩니다.
여기서 우리는 몇 가지 물건을 보았다.
AjaxParams, 이것은 URL 파라미터를 설정하는 클래스입니다.
필자는 실제 사용 과정에서 두 가지 결함이 있음을 발견하였다.
하나는 안에 사용된 ConcurrentHashMap입니다. 자바에서 자주 사용하는 몇 가지 집합의 대비를 살펴보겠습니다.
Map
HashMap 무질서
HashTable: 스레드 보안
LinkedHashMap 순서
ConcurrentHashMap 무질서 스레드 보안
TreeMap:순서재정리
ConcurrentHashMap은 라인이 안전하지만 순서가 없습니다.높은 병발 상황에 적용되지만 무질서한 것은 적절하지 않다.예를 들면 www.bvin.com/login.jsp?name=bvin&pw=88888, 이 Ajax로 Put에 들어가면 ww.bvin.com/login.jsp?pw=8888 &name=bvin, 분명히 잘못된 거야.
또 하나는 이 종류에 clean()이나removeAll() 방법이 없다는 것이다.이 종류를 다시 사용하려면 new를 다시 사용해야 합니다.사실 이런 방법을 쓰면 손을 들고 발을 동동 구르는 일입니다. AjaxParams에는 사실 두 개의 ConcurrentHashMap 실례가 있습니다.아래 두 개만 비우면 돼.
protected ConcurrentHashMap urlParams; protected ConcurrentHashMap fileParams;
AjaxCallBack, 이것은 범형 추상 클래스로 리셋 작용을 한다.
   public void onStart(){};
    public void onLoading(long count,long current){};
    public void onSuccess(T t){};
    public void onFailure(Throwable t,String strMsg){};

3. 요청 발송 방법
 protected <T> void sendRequest(DefaultHttpClient client, HttpContext httpContext, HttpUriRequest uriRequest, String contentType, AjaxCallBack<T> ajaxCallBack) {
        if(contentType != null) {
            uriRequest.addHeader("Content-Type", contentType);
        }

        new HttpHandler<T>(client, httpContext, ajaxCallBack,charset)
        .executeOnExecutor(executor, uriRequest);

    }
    
    protected Object sendSyncRequest(DefaultHttpClient client, HttpContext httpContext, HttpUriRequest uriRequest, String contentType) {
        if(contentType != null) {
            uriRequest.addHeader("Content-Type", contentType);
        }
        return new SyncRequestHandler(client, httpContext,charset).sendRequest(uriRequest);
    }

 
여기에는 HttpHandler와 SyncRequestHandler 두 종류가 관련되어 있습니다. 다음에 분해됩니다...

좋은 웹페이지 즐겨찾기