2011-12-23 3 views
2

안녕하세요, 비동기 작업을 사용하여 기본 로그인 시스템을 사용하려고합니다.이 튜토리얼에서 배웠습니다. 나는 문제가있다. android.os.networkexception을 극복하려면 비동기를 사용하지만이 상황에서 완전히 잘못 사용하고 있다고 확신합니다.android login async 작업에 오류가 발생했습니다.

package com.example.toknapp; 

import java.util.ArrayList; 

import org.apache.http.NameValuePair; 
import org.apache.http.message.BasicNameValuePair; 

import android.app.Activity; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 

public class login2 extends Activity { 
    EditText un; 
    TextView error; 
    Button ok; 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.login); 
     un=(EditText)findViewById(R.id.et_un); 
     ok=(Button)findViewById(R.id.btn_login); 
     error=(TextView)findViewById(R.id.tv_error); 

     ok.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       GetData task = new GetData(); 
       task.execute(); 


      } 
     }); 
    } 

    private class GetData extends AsyncTask<String, Void, String> { 
     @Override 
     protected String doInBackground(String... urls) { 
      ArrayList<NameValuePair> postParameters = new ArrayList<NameValuePair>(); 
      postParameters.add(new BasicNameValuePair("username", un.getText().toString())); 
      //String valid = "1"; 
      String response = null; 
      try { 
       response = CustomHttpClient.executeHttpPost("http://tokn.me/android_merchant_login.php", postParameters); 
       String res=response.toString(); 
       // res = res.trim(); 
       res= res.replaceAll("\\s+","");        
       //error.setText(res); 

       if(res.equals("1")) 
        error.setText("Correct Username or Password"); 
       else 
        error.setText("Sorry!! Incorrect Username or Password"); 
      } catch (Exception e) { 
       un.setText(e.toString()); 
      } 


      return response; 
     } 
    } 
} 

로그 캣 :

E/AndroidRuntime(1188): FATAL EXCEPTION: AsyncTask #1 
E/AndroidRuntime(1188): java.lang.RuntimeException: An error occured while exec 
uting doInBackground() 
E/AndroidRuntime(1188):  at android.os.AsyncTask$3.done(AsyncTask.java:27 
8) 
E/AndroidRuntime(1188):  at java.util.concurrent.FutureTask$Sync.innerSet 
Exception(FutureTask.java:273) 
E/AndroidRuntime(1188):  at java.util.concurrent.FutureTask.setException(
FutureTask.java:124) 
E/AndroidRuntime(1188):  at java.util.concurrent.FutureTask$Sync.innerRun 
(FutureTask.java:307) 
E/AndroidRuntime(1188):  at java.util.concurrent.FutureTask.run(FutureTas 
k.java:137) 
E/AndroidRuntime(1188):  at android.os.AsyncTask$SerialExecutor$1.run(Asy 
ncTask.java:208) 
E/AndroidRuntime(1188):  at java.util.concurrent.ThreadPoolExecutor.runWo 
rker(ThreadPoolExecutor.java:1076) 
E/AndroidRuntime(1188):  at java.util.concurrent.ThreadPoolExecutor$Worke 
r.run(ThreadPoolExecutor.java:569) 
E/AndroidRuntime(1188):  at java.lang.Thread.run(Thread.java:856) 
E/AndroidRuntime(1188): Caused by: android.view.ViewRootImpl$CalledFromWrongThr 
eadException: Only the original thread that created a view hierarchy can touch i 
ts views. 
E/AndroidRuntime(1188):  at android.view.ViewRootImpl.checkThread(ViewRoo 
tImpl.java:3903) 
E/AndroidRuntime(1188):  at android.view.ViewRootImpl.invalidateChild(Vie 
wRootImpl.java:708) 
E/AndroidRuntime(1188):  at android.view.ViewRootImpl.invalidateChildInPa 
rent(ViewRootImpl.java:757) 
E/AndroidRuntime(1188):  at android.view.ViewGroup.invalidateChild(ViewGr 
oup.java:4006) 
E/AndroidRuntime(1188):  at android.view.View.invalidate(View.java:8432) 
E/AndroidRuntime(1188):  at android.widget.TextView.invalidateCursor(Text 
View.java:4318) 
E/AndroidRuntime(1188):  at android.widget.TextView.spanChange(TextView.j 
ava:7669) 
E/AndroidRuntime(1188):  at android.widget.TextView$ChangeWatcher.onSpanA 
dded(TextView.java:8018) 
E/AndroidRuntime(1188):  at android.text.SpannableStringBuilder.sendSpanA 
dded(SpannableStringBuilder.java:898) 
E/AndroidRuntime(1188):  at android.text.SpannableStringBuilder.setSpan(S 
pannableStringBuilder.java:614) 
E/AndroidRuntime(1188):  at android.text.SpannableStringBuilder.setSpan(S 
pannableStringBuilder.java:520) 
E/AndroidRuntime(1188):  at android.text.Selection.setSelection(Selection 
.java:76) 
E/AndroidRuntime(1188):  at android.text.Selection.setSelection(Selection 
.java:87) 
E/AndroidRuntime(1188):  at android.text.method.ArrowKeyMovementMethod.in 
itialize(ArrowKeyMovementMethod.java:302) 
E/AndroidRuntime(1188):  at android.widget.TextView.setText(TextView.java 
:3243) 
E/AndroidRuntime(1188):  at android.widget.TextView.setText(TextView.java 
:3109) 
E/AndroidRuntime(1188):  at android.widget.EditText.setText(EditText.java 
:78) 
E/AndroidRuntime(1188):  at android.widget.TextView.setText(TextView.java 
:3084) 
E/AndroidRuntime(1188):  at com.example.toknapp.login2$GetData.doInBackgr 
ound(login2.java:61) 
E/AndroidRuntime(1188):  at com.example.toknapp.login2$GetData.doInBackgr 
ound(login2.java:1) 
E/AndroidRuntime(1188):  at android.os.AsyncTask$2.call(AsyncTask.java:26 
4) 
E/AndroidRuntime(1188):  at java.util.concurrent.FutureTask$Sync.innerRun 
(FutureTask.java:305) 
E/AndroidRuntime(1188):  ... 5 more 
W/ActivityManager( 85): Force finishing activity com.example.toknapp/.toknap 
p 
W/WindowManager( 85): Failure taking screenshot for (180x300) to layer 21015 
W/InputManagerService( 85): Starting input on non-focused client com.android.i 
[email protected] (uid=10040 pid=1188) 
W/IInputConnectionWrapper(1188): showStatusIcon on inactive InputConnection 
W/NetworkManagementSocketTagger( 85): setKernelCountSet(10004, 1) failed with 
errno -2 
W/NetworkManagementSocketTagger( 85): setKernelCountSet(10040, 0) failed with 
errno -2 
I/Process (1188): Sending signal. PID: 1188 SIG: 9 
W/InputManagerService( 85): Window already focused, ignoring focus gain of: co 
[email protected] 
I/ActivityManager( 85): Process com.example.toknapp (pid 1188) has died. 
W/BinderNative( 85): Uncaught exception from death notification 
W/BinderNative( 85): java.lang.IllegalArgumentException: Service not registere 
d: com.andr[email protected]417c4 
b78 
W/BinderNative( 85): at android.app.LoadedApk.forgetServiceDispatcher(LoadedA 
pk.java:888) 
W/BinderNative( 85): at android.app.ContextImpl.unbindService(ContextImpl.jav 
a:1147) 
W/BinderNative( 85): at com.android.server.TextServicesManagerService$SpellCh 
eckerBindGroup.cleanLocked(TextServicesManagerService.java:592) 
W/BinderNative( 85): at com.android.server.TextServicesManagerService$SpellCh 
eckerBindGroup.removeListener(TextServicesManagerService.java:575) 
W/BinderNative( 85): at com.android.server.TextServicesManagerService$Interna 
lDeathRecipient.binderDied(TextServicesManagerService.java:662) 
W/BinderNative( 85): at android.os.BinderProxy.sendDeathNotice(Binder.java:41 
7) 
W/BinderNative( 85): at dalvik.system.NativeStart.run(Native Method) 
+0

에러가 있습니까? 얼마나? 그들은 무엇입니까? logcat을 게시하십시오. –

+0

doInBackground()에서 텍스트를 설정하지 말고 텍스트를 설정 한 다음 postExecute()에서 변경하려는 경우 제거하십시오 –

답변

1

실제로 실행됩니다 UI 스레드가 아닌 별도의 스레드. setText() 또는 이미지 리소스 또는 기타 설정과 같은 일부 UI 요소를 변경하려면 UI 스레드에서 수행해야합니다.

onPreExecute 및 onPostExecute() 메서드는 AsyncTask의 UI 스레드에서 실행됩니다. 이 흐름이 순서대로 방법입니다 -

onPreExecute() -> doInBackground() -> onPostExecute() 

그래서 당신은 doInBackground에서하고있는 설정 UI 요소 onPostExecute에서 그것을 할 어떤().

기본적으로 doInBackground는 서버에 연결하고 응답 만 가져야합니다. onPOstExecute()가 나머지 (텍스트 내용 설정)를 처리하도록합니다.

UI 스레드를 업데이트하려면 publishProgress (param) 메서드를 사용해야합니다. 안드로이드 문서에서 제공되는 샘플이 유용합니다.

http://developer.android.com/reference/android/os/AsyncTask.html#pubmethods "사용법"섹션의 코드 스 니펫을 참조하십시오.

+0

도와 주신 .. 감사합니다! – re1man

0

는, AsyncTask를 세 단계가 있습니다, 이것은 당신에게 비동기 작업에 대한 아이디어를 줄 것이다, (1) preExecute (이 link를보십시오), (여기에 코드입니다 2) doInBackground(), (3) postExecute(). doInBackground()에서 컨트롤을 변경할 수 없으며 postExecute() 또는 preExecute()에서 컨트롤을 변경할 수 있습니다 ... !! 또한 응답이 오지 않는 동안 여전히 UI를 변경하려면 UI 스레드에서 호출을 호출하려면 publishProgress() 및 onProgressUpdate()에서 수행 할 수 있습니다.

0

문제는 UI 스레드에서 실행되지 않는 doInBackground 메서드에서 UI를 업데이트하려고하는 것입니다. 거기에서 '오류'보기를 건드릴 수 없습니다.

당신이 AsyncTask를 사용할 때 당신은 단지를 통해 UI를 업데이트 할 수 있습니다

  • onPreExecute
  • onPostExecute
  • publishProgress/onProgressUpdate doInBackground() 내부에서 무슨 일이 있어도
관련 문제