2011-12-23 3 views
2

Привет, я пытаюсь использовать задачу Async, чтобы использовать базовую систему входа в систему, которую я получил из учебника (только для изучения). У меня есть проблемы. Чтобы перебрать android.os.networkexception, я использую async, но я уверен, что я использую его совершенно неправильно в этой ситуации. Вот код:android login get errors with async task

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; 
     } 
    } 
} 

LogCat:

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

ошибки? сколько? которые они? разместите логарифм. –

+0

dont set text while in doInBackground(), удалите его оттуда, если вы хотите установить текст, а затем измените его в postExecute() –

ответ

1

Все, что происходит внутри doInBackground() на самом деле работает на отдельный поток, а не поток UI. Если вы хотите изменить какой-либо элемент пользовательского интерфейса, например setText() или установить ресурсы изображения или что-нибудь еще, вы должны делать это в потоке пользовательского интерфейса.

onPreExecute и onPostExecute() методы AsyncTask запускаются в потоке пользовательского интерфейса. Это как поток в порядке -

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

Так независимо от настройки элементов пользовательского интерфейса вы делаете в doInBackground сделать это в onPostExecute().

Так что в основном ваш doInBackground должен только подключаться к серверу и получать ответ. Пусть onPOstExecute() обрабатывает остальные (установка текстового материала).

Нам нужно использовать метод publishProgress (param) для обновления потока пользовательского интерфейса, образец, предоставленный в документации по android, полезен.

http://developer.android.com/reference/android/os/AsyncTask.html#pubmethods см. Фрагмент кода в разделе «Использование».

+0

помогли alot ..thanks! – re1man

0

Попробуйте link, Это даст вам представление о асинхронной задаче, есть три фазы в AsyncTask (1) preExecute(), (2) doInBackground(), (3) postExecute(). Вы не можете изменять какие-либо элементы управления, пока он находится в doInBackground(), вы можете изменить элементы управления в postExecute() или preExecute() ... !! Кроме того, если вы все еще хотите изменить пользовательский интерфейс, в то время как havent еще не пришел, то для вызова run в потоке пользовательского интерфейса вы можете сделать это в publishProgress() и onProgressUpdate().

0

Проблема в том, что вы пытаетесь обновить пользовательский интерфейс из метода doInBackground, который не запускается в потоке пользовательского интерфейса. Оттуда вы не можете дотронуться до «ошибки».

При использовании AsyncTask вы можете обновить пользовательский интерфейс только через:

  • onPreExecute
  • onPostExecute
  • publishProgress/onProgressUpdate