2012-10-04 8 views
0

다음 코드를 실행할 때 예외가 발생합니다.Android에서 AsyncTask를 사용하여 활동 만들기

public class LoginActivity extends Activity { 
/** Called when the activity is first created. */ 
Button btnSend, btnDelete; 
EditText edtUsername, edtPassword; 
TextView tvUsername, tvPassword; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    initializeProperties(); 

    btnGonder.setOnClickListener(new OnClickListener() { public void onClick(View view) {   
     login("[email protected]", "123456"); 
    }}); 
    btnSil.setOnClickListener(new OnClickListener() { public void onClick(View view) { 
     clearView(); 
    }}); 
} 

private void initializeProperties() { 
    btnSend = (Button) findViewById(R.id.bSend); 
    btnDelete = (Button) findViewById(R.id.bDelete); 
    tvUsername = (TextView) findViewById(R.id.tvUsername); 
    edtUsername = (EditText) findViewById(R.id.etUsername); 
    tvPassword = (TextView) findViewById(R.id.tvPassword); 
    edtPassword = (EditText) findViewById(R.id.etPassword); 
} 

private static final String readInputStream(java.io.InputStream stream) throws IOException { 
    java.io.InputStreamReader streamReader = new java.io.InputStreamReader(stream); 
    java.io.BufferedReader bufferedReader = new java.io.BufferedReader(streamReader); 
    String line, redText = ""; 
    while ((line = bufferedReader.readLine()) != null) { 
     redText += line; 
    } 
    bufferedReader.close(); 
    return redText; 
} 

private void clearView() { 
    edtPassword.setText(""); 
} 

private void login(String username, String password) { 

    HttpPost httpPost = new HttpPost("http://192.168.1.1/api/login"); 

    AlertDialog.Builder alertBuilder = new AlertDialog.Builder(getApplicationContext()); 
    alertBuilder.setCancelable(true); 

    //HttpResponse response = null; 
    try { 
     // Add your data 
     httpPost.setEntity(new StringEntity(
      String.format("{ 'Email': '%s', 'Password': '%s' }", username, password) 
     )); 
     // Set Headers 
     httpPost.setHeader("Content-Type", "application/json; charset=utf-8"); 
     // Execute HTTP Post Request 
     //response = new AsyncLoginHandler(alertBuilder).execute(httpPost).get(); 
     new AsyncLoginHandler(alertBuilder).execute(httpPost); 

    } catch (UnsupportedEncodingException uee) { 
     alertBuilder.setMessage(uee.getMessage()); 
    } 
} 

class AsyncLoginHandler extends android.os.AsyncTask<HttpPost, Void, HttpResponse> { 
    AlertDialog.Builder alertBuilder; 

    AsyncLoginHandler(AlertDialog.Builder alertBuilder) { 
     super(); 
     this.alertBuilder = alertBuilder; 
    } 

    @Override 
    protected HttpResponse doInBackground(HttpPost... params) { 
     HttpClient httpClient = new DefaultHttpClient(); 
     HttpResponse httpResponse = null; 
     for (int i = 0; i < params.length; i++) { 
      try { 
       httpResponse = httpClient.execute(params[i]); 
      } catch (ClientProtocolException cpe) { 
       alertBuilder.setMessage(cpe.getMessage()); 
      } catch (IOException ioe) { 
       alertBuilder.setMessage(ioe.getMessage()); 
      } catch (Exception e) { 
       alertBuilder.setMessage(e.getMessage()); 
      } 
     } 
     return httpResponse; 
    } 

    @Override 
    protected void onPostExecute(HttpResponse response) { 
     if (response != null) { 
      try { 
       java.io.InputStream stream = response.getEntity().getContent(); 
       String result = readInputStream(stream); 
       alertBuilder.setMessage(result); 
      } catch (IllegalStateException ise) { 
       alertBuilder.setMessage(ise.getMessage()); 
      } catch (IOException ioe) { 
       alertBuilder.setMessage(ioe.getMessage()); 
      } 
     } 

     super.onPostExecute(response); 

     alertBuilder.create().show(); 
    } 

} 

}

음 ... AsyncTask ("4 단계"제목 참조) onPostExecute는 UI 스레드에서 호출되는 상태의 안드로이드의 문서 페이지; 그러나 "alertBuilder.create(). show();"뒤에 다음 오류가 발생합니다. "

- 10-04 06:36:25.607: W/dalvikvm(711): threadid=1: thread exiting with uncaught exception (group=0x409c01f8) 
- 10-04 06:36:25.657: E/AndroidRuntime(711): FATAL EXCEPTION: main 
- 10-04 06:36:25.657: E/AndroidRuntime(711): android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application 
- 10-04 06:36:25.657: E/AndroidRuntime(711): at android.view.ViewRootImpl.setView(ViewRootImpl.java:517) 
- 10-04 06:36:25.657: E/AndroidRuntime(711): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:301) 
- 10-04 06:36:25.657: E/AndroidRuntime(711): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:215) 
- 10-04 06:36:25.657: E/AndroidRuntime(711): at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:140) 
- 10-04 06:36:25.657: E/AndroidRuntime(711): at android.app.Dialog.show(Dialog.java:278) 
- 10-04 06:36:25.657: E/AndroidRuntime(711): at org.gdgankara.com.LoginActivity$AsyncLoginHandler.onPostExecute(LoginActivity.java:139) 
- 10-04 06:36:25.657: E/AndroidRuntime(711): at org.gdgankara.com.LoginActivity$AsyncLoginHandler.onPostExecute(LoginActivity.java:1) 
- 10-04 06:36:25.657: E/AndroidRuntime(711): at android.os.AsyncTask.finish(AsyncTask.java:602) 
- 10-04 06:36:25.657: E/AndroidRuntime(711): at android.os.AsyncTask.access$600(AsyncTask.java:156) 
- 10-04 06:36:25.657: E/AndroidRuntime(711): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:615) 
- 10-04 06:36:25.657: E/AndroidRuntime(711): at android.os.Handler.dispatchMessage(Handler.java:99) 
- 10-04 06:36:25.657: E/AndroidRuntime(711): at android.os.Looper.loop(Looper.java:137) 
- 10-04 06:36:25.657: E/AndroidRuntime(711): at android.app.ActivityThread.main(ActivityThread.java:4424) 
- 10-04 06:36:25.657: E/AndroidRuntime(711): at java.lang.reflect.Method.invokeNative(Native Method) 
- 10-04 06:36:25.657: E/AndroidRuntime(711): at java.lang.reflect.Method.invoke(Method.java:511) 
- 10-04 06:36:25.657: E/AndroidRuntime(711): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
- 10-04 06:36:25.657: E/AndroidRuntime(711): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
- 10-04 06:36:25.657: E/AndroidRuntime(711): at dalvik.system.NativeStart.main(Native Method) 

아무도 도와 줄 수 있습니까?

+1

빌더가 컨텍스트로 활동을 가져 오지만 getApplicationContext()와 작동하지 않습니다. – njzk2

+0

@ njzk2 : 감사합니다! 그러나 어떻게? 그것이 UIThread와 응용 프로그램 스레드가 다르다는 것을 의미합니까? LoginActivity의 컨텍스트가 LoginActivity.getApplicationContext()와 다른 이유는 무엇입니까? – rebulanyum

+0

내 게시물을 확인하십시오 http://stackoverflow.com/a/10346079/598170 – Som

답변

-1

doInBackground 메서드는 주 스레드 뷰를 만질 수 없습니다. 경고 대화 상자의 메시지를 doInBackground 메소드에서 설정할 수 없다는 것을 의미합니다. doInBackground 내부의 catch에서 set 3 set 메시지를 제거하고 응용 프로그램을 실행하십시오.

+0

잘못되었거나 관련성이 없습니다. setMessage는 AlertDialog.Builder에 있으며 그래픽 위젯을 포함하지 않으므로 ui 스레드에서 액세스 할 필요가 없습니다. – njzk2

+0

onPreExecute –

+0

이 나 빠지고있는 동안 빌더를 만들려고합니다. 'onPreExecute'에'builder.create()'가 있다면, 빌더는 주어진 데이터로 AlertDialog를 빌드합니다. 그런 다음이 alertDialog를 사용하거나 빌더를 채우고 나중에 완전한 AlertDialog를 생성 할 수 있습니다. – njzk2

관련 문제