android登录使用异步任务获取错误

时间:2011-12-23 06:22:26

标签: android

您好我正在尝试使用Async任务来利用我从教程中获得的基本登录系统(只是为了学习)。我有问题。为了克服android.os.networkexception我使用异步,但我确定在这种情况下我完全错误地使用它。这是代码:

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
nternal.view.IInputMethodClient$Stub$Proxy@417c3938 (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
m.android.internal.view.IInputMethodClient$Stub$Proxy@4135b3d8
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.android.server.TextServicesManagerService$InternalServiceConnection@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)

3 个答案:

答案 0 :(得分:1)

doInBackground()内部发生的任何事情实际上是在单独的线程上运行而不是在UI线程上运行。如果要更改某些UI元素(如setText()或设置图像资源或任何内容),您应该在UI线程中执行此操作。

在UI线程上运行AsyncTask的onPreExecute和onPostExecute()方法。这就是流程的顺序 -

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

因此,无论您在doInBackground中执行的UI元素设置如何,都在onPostExecute()中执行。

基本上,你的doInBackground应该只是连接到服务器并获得响应。让onPOstExecute()处理其余的(设置文本内容)。

我们需要使用publishProgress(param)方法来更新UI线程,android文档中提供的示例很有帮助。

http://developer.android.com/reference/android/os/AsyncTask.html#pubmethods 请参阅“使用情况”部分下的代码段。

答案 1 :(得分:0)

试试这个link,这将让你了解异步任务,asynctask有三个阶段,(1)preExecute(),(2)doInBackground(),(3)postExecute()。在doInBackground()中你不能改变任何控件,你可以在postExecute()或preExecute()中改变控件...... !!此外,如果您仍想在响应尚未到来时更改UI,那么要在UI线程上调用run,您可以在publishProgress()和onProgressUpdate()中执行此操作。

答案 2 :(得分:0)

问题是您正在尝试从不在UI线程上运行的doInBackground方法更新UI。您无法从那里触摸视图“错误”。

使用AsyncTask时,您只能通过以下方式更新UI:

  • onPreExecute
  • onPostExecute
  • publishProgress / onProgressUpdate