2013-07-01 3 views
1

이것은 LoginActivity.java에있는 제 함수입니다.이 함수를 호출하는 버튼의 onclick입니다. 내가 HTTP를 Communication.So에 대한 AsynkTask를 호출하고이 함수에서ProcessDialog가 제대로 나타나지 않습니까?

public void postHttpRequest(String userId,String pass,TextView error){ 
     RequestClient reqClient = new RequestClient(LoginActivity.this); 
     String AppResponse = null; 
     try { 
      url = "myurl"; 
      Log.d("URL", url); 
      AppResponse = reqClient.execute().get(); 
      String status = ValidateLoginStatus.checkLoginStatus(AppResponse); 
      Log.d("Status recived", status); 

      if(status.equals("200")){ 
       saveInformation(userId,pass); 
       startingActivity(HOST_URL); 
      }else{ 
       error.setText("Incorrect UserName or Password"); 
      } 
     } catch (Exception e) { 
      Log.e("Exception Occured", "Exception is "+e.getMessage()); 
     } 
    } 

내가 한 sec.I에 대한 개방에 다음 내 processDialog를 응답을 geeting하고 때 버튼의 onclick을 내가 buttoon를 클릭 나의 processDialog 얻을해야합니다 열린 utill 내가 응답

public class RequestClient extends AsyncTask<String, Void, String>{ 
    ProgressDialog pDialog; 
    Context context; 

    public RequestClient(Context c) { 
     context = c; 
    } 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     pDialog = new ProgressDialog(context); 
     pDialog.setMessage("Authenticating user..."); 
     pDialog.show(); 

    } 

    @Override 
    protected String doInBackground(String... aurl){ 
    String responseString=""; 
    DefaultHttpClient httpClient=new DefaultHttpClient(); 
    try { 
     HttpClient client = new DefaultHttpClient(); 
     HttpGet get = new HttpGet(LoginActivity.url); 
     HttpResponse responseGet = client.execute(get); 
     HttpEntity resEntityGet = responseGet.getEntity(); 
     if (resEntityGet != null) { 
      responseString = EntityUtils.toString(resEntityGet); 
      Log.i("GET RESPONSE", responseString); 
     } 
    } catch (Exception e) { 
     Log.d("ANDRO_ASYNC_ERROR", "Error is "+e.toString()); 
    } 
    Log.d("ANDRO_ASYNC_ERROR", responseString); 
    httpClient.getConnectionManager().shutdown(); 
    return responseString; 

    } 


    @Override 
    protected void onPostExecute(String response) { 
     super.onPostExecute(response); 
      if(pDialog!=null) 
      pDialog.dismiss(); 
    } 
} 
있어

그래서 내가 processDialog이 progressbialog에 스타일을 추가 // 장치

+1

은 아마 당신은 onPostExecute에서 대화 상자를 닫습니다 않습니다. 거기에 중단 점을 넣고보십시오. –

+0

진행 상황이 전혀 보이지 않습니까? – Dimmerg

+0

응답을 얻은 후 단 1 초 만에 대화 상자가 열립니다. –

답변

0

AsyncTask return value only after using get() method

get()를 호출 위의 링크

에서 그리기를의 방법은 주 스레드를 차단하고 결과가 반환되기를 기다립니다. 이것은 효과적으로 AsyncTask를 사용하여 AsyncTask를 사용하지 않는 동기 작업이되도록합니다.

get() 메서드를 사용하는 유일한 방법은 주 (UI) 스레드가 아닌 다른 스레드에서 발생하는 것이지만 그 이유는 많이 있습니다. 활동 클래스에서 버튼을 클릭

 RequestClient reqClient = new RequestClient(LoginActivity.this,new TheInterface() { 
      @Override 
      public void theMethod(String result) { 
       Log.i("Result =",result); 
      } 
     }); 
     reqClient.execute(url); // no get(). pass url to doInBackground()  

public interface TheInterface { 
    public void theMethod(String result); 

     } 
    } 

AsyncTask를

public class RequestClient extends AsyncTask<String, Void, String>{ 
    ProgressDialog pDialog; 
    Context context; 
    TheInterface listener; 
    public RequestClient(Context c,TheInterface listen) { 
     context = c; 
     listener = listen; 
    } 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     pDialog = new ProgressDialog(context); 
     pDialog.setMessage("Authenticating user..."); 
     pDialog.show(); 

    } 

    @Override 
    protected String doInBackground(String... aurl){ 
    String responseString=""; 
    HttpClient client; 
    try { 
     HttpClient client = new DefaultHttpClient(); 
     HttpGet get = new HttpGet(aurl[0]); // url 
     HttpResponse responseGet = client.execute(get); 
     HttpEntity resEntityGet = responseGet.getEntity(); 
     if (resEntityGet != null) { 
      responseString = EntityUtils.toString(resEntityGet); 
      Log.i("GET RESPONSE", responseString); 
     } 
    } catch (Exception e) { 
     Log.d("ANDRO_ASYNC_ERROR", "Error is "+e.toString()); 
    } 
    Log.d("ANDRO_ASYNC_ERROR", responseString); 
    client.getConnectionManager().shutdown(); 
    return responseString; 

    } 


    @Override 
    protected void onPostExecute(String response) { 
     super.onPostExecute(response); 
       pDialog.dismiss(); 
       if (listener != null) 
       { 
       listener.theMethod(result); 
       } 

    } 
} 
1

의 중앙에 제대로 표시해야하므로 확인해야 변경 걸 제안 해주십시오

protected void onPreExecute() { 
      super.onPreExecute(); 
pDialog = new ProgressDialog(context); 
pDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
     pDialog.setMessage("Authenticating user..."); 

if (pDialog != null && !pDialog.isShowing()) { 
         pDialog.show(); 
        } 
} 
+0

여전히 같은 문제입니다. –

0

비동기이기 때문에 버튼 코드가 ​​올바르지 않지만 대기 코드로 사용하려고합니다.

String status = ValidateLoginStatus.checkLoginStatus(response); 
      Log.d("Status recived", status); 

      if(status.equals("200")){ 
       saveInformation(userId,pass); 
       startingActivity(HOST_URL); 
      }else{ 
       error.setText("Incorrect UserName or Password"); 
      } 

을이 버튼을 클릭 코드합니다 :

봅니다 onPostExecute에이 코드를 이동

public void postHttpRequest(String userId,String pass,TextView error){ 
     RequestClient reqClient = new RequestClient(LoginActivity.this); 
     String AppResponse = null; 
     try { 
      url = "myurl"; 
      Log.d("URL", url); 
      reqClient.execute(); 
     } catch (Exception e) { 
      Log.e("Exception Occured", "Exception is "+e.getMessage()); 
     } 
    } 
관련 문제