2012-05-12 2 views
0

저는 서버와 HTTP 메시지를주고받는 Android 프로젝트 (API 레벨 10)에서 작업하고 있습니다.Android의 범용 네트워크 관리자

각 HTTP 요청마다 하나씩 다른 메소드 (예 : loginRequest (user pass), RegistrationRequest (user .....))를 제공하는 NetworkManager라는 클래스를 구현했습니다.

이 모든 메소드는 sendMessage라는 메소드에 전달되는 JSON 객체를 생성합니다.이 메소드는 실제로 연결을 설정하고 응답을 보내고받습니다 (json 객체).

물론 네트워크 호출에는 많은 시간이 소요되므로 네트워크 작업이 진행되는 동안 AsyncTask를 사용하여 progressDialog를 표시하기로 결정했습니다.

문제는 메인 스레드가 수행 한 결과 자체가 포함 된 다른 작업을 실행하기 전에 백그라운드 스레드에서 응답 값을 얻는 것이 필요하다는 것입니다. 동시에 AsyncTask의 공통적이고 재사용 가능한 구현을 만들고 싶습니다.

예 : 2 개의 EditText (사용자 이름, 비밀번호)와 로그인 버튼을 보여주는 로그인 활동이 있습니다. 로그인 버튼을 누르면 progressDialog가 나타나야하며 doInBackground 작업이 완료되면 처리해야합니다. 나는 어떤을 보낼 필요가 모든 요청에 ​​대한 비동기 작업을 구현해야합니다 이런 식으로 내가 N 요청이있는 경우 때문에 내가 만들어야 피하기 위해 싶은 것이있다하고,

onClick(View v) //called when the login button is pressed 
{ 
    onPreExecute() 
    { 
     //Show the progress dialog 
    } 

    doInBackground() 
    { 
     //Retreive the login response (an integer containing a message code) using sendLoginRequest(username, password); 
     //return the response 
    } 

    onPostExecute(int response) 
    { 
     //Dispose the progress dialog, then loginSucessfull ? start new activity : show error toast 
    } 
} 

그러나 : 물론 나는이 방법을 할 수 AsyncTask를 확장하는 N 개의 클래스.

감사합니다.

답변

2

http 요청의 응답을 처리하기 위해 INTERFACES을 사용하는 것이 좋습니다.

배경 스레드 중 하나 그것은 AysncTask 수 있거나 스레드가

이 방법

처럼 생각 모두

  • 응답

  • 예외를 처리해야 할 메인 스레드 - H ey 배경 스레드이 작업을 수행하고 완료되면 알려주십시오.

    MainThread 배경 스레드가 작업을 실행하면 진행률 대화 상자가 표시됩니다.

    BackGroundThread - 제 작업으로 끝났습니다. 여기 MainThread가 응답 또는 예외를 잡습니다.

    MainThread - 진행률 표시 줄 표시를 중지합시다.

    코드를 통해이 콜백 메커니즘을 시뮬레이트해야하며 재사용 가능한 아키텍처를 구현해야합니다.이

    같은

    뭔가 같이 할 활동 코드 파일에 어딘가에 지금 인터페이스

    public interface HttpRequestResponse { 
        public void onSuccess(HttpResponse response); 
        public void onException(Exception exception); 
    }  
    
    
    class HttpRequestResponseHandler { 
    
        private ActionItem action; 
        private HttpRequestResponse hrr; 
        private Executor executor; 
    
        public enum ActionItem { 
         LOGIN_REQUEST , 
         REGISTRATION_REQUEST    
        } 
    
        public HttpRequestResponseHandler(ActionItem action, HttpRequestResponse hrr) { 
         this.action = action; 
         this.hrr = hrr;  
        } 
    
        public void execute(){ 
        executor = new Executor(); 
        executor.execute();  
        } 
    
        private class Executor extends AsyncTask<Void,Void,Void> { 
    
         @Override 
         public Void doInBackground() { 
         switch(action) { 
    
          case LOGIN_REQUEST : doLogin(); 
               break; 
    
          case REGISTRATION_REQUEST : doRegistration(); 
                 break; 
         } 
         } 
        } 
    
        private void doLogin() { 
    
         HttpResponse response = null; 
         Exception exception = null; 
         try { 
         response = makeHttpRequestHere(); 
         } catch (Exception e) { 
         exception = e; 
         } 
    
         if(exception != null) { 
         hrr.onException(exception); 
         } else { 
         hrr.onSuccess(response); 
         } 
    
        } 
    
    } 
    

    을 정의합니다.

    HttpRequestResponse hrr = new HttpRequestResponse(){ 
    
        @Override 
        public void onSuccess(HttpResponse response) { 
         hideProgressDialog(); 
         handleResponse(response); 
        } 
    
        @Override 
        public void onException(Exception exception) { 
         hideProgressDialog(); 
         showErrorDialog(exception.getMessage()); 
        } 
    } 
    
    HttpRequestResponseHandler hrrh = new HttpRequestResponseHandler(ActionItem.LOGIN_REQUEST,hrr); 
    hrrh.execute(); 
    showProgressDialog(); 
    

    희망 사항이 모두 원하는대로 연결되기를 바랍니다. 그 대답은 길었고 생각하기에 꽤 많은 노력을 기울였습니다. :)

+0

감사합니다, 아주 명확! 거의 수정하지 않고 코드를 프로젝트에 재사용 할 수있었습니다 ;-) – MastErAldo

+0

대답의 왼쪽에있는 녹색 오른쪽 기호를 클릭하여 대답을 수락하는 데 도움이되는 경우. 이 방법을 사용하면 응답을 높이 평가하고 다른 방향으로 올바른 방향으로 이끌 수 있습니다. 이 방법으로이 커뮤니티가 작동합니다. :) – Javanator

0

그냥 AsyncTask.THREAD_POOL_EXECUTOR (Runnable run)을 사용하지 않는 이유는 무엇입니까?

#cores + 1 병렬 수준의 스레드 풀 기반 실행 프로그램을 래핑합니다.

그럼 당신은 간단하게 호출 할 수 있습니다 응답에 대한

AsyncTask.THREAD_POOL_EXECUTOR(new Runnable(){ 
    public void run(){ 
     doLogin(); 
}); 
관련 문제