Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/217.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
android登录获取异步任务错误_Android - Fatal编程技术网

android登录获取异步任务错误

android登录获取异步任务错误,android,Android,嗨,我正在尝试使用异步任务来利用我从教程中获得的基本登录系统(只是为了学习)。我有一些问题。为了克服android.os.networkexception,我使用了async,但我确信在这种情况下我完全没有正确地使用它。代码如下: package com.example.toknapp; import java.util.ArrayList; import org.apache.http.NameValuePair; import org.apache.http.message.BasicN

嗨,我正在尝试使用异步任务来利用我从教程中获得的基本登录系统(只是为了学习)。我有一些问题。为了克服android.os.networkexception,我使用了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;
        }
    }
}

试试这个,这会给你一个关于异步任务的想法,异步任务有三个阶段,(1)preExecute(),(2)doInBackground(),(3)postExecute()。在doInBackground()中不能更改任何控件,可以在postExecute()或preExecute()中更改控件。。。!!此外,如果您仍然希望在响应尚未到来时更改UI,那么要调用run on UI thread,您可以在publishProgress()和onProgressUpdate()中执行此操作。

问题在于,您试图从doInBackground方法更新UI,而该方法不在UI线程上运行。您不能从那里触摸视图“错误”

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

  • 预先执行
  • onPostExecute
  • publishProgress/onProgressUpdate

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

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

      onPreExecute() -> doInBackground() -> onPostExecute()
      
      因此,无论您在doInBackground中执行什么设置UI元素,都要在onPostExecute()中执行

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

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


      请参阅“用法”部分下的代码片段。

      是否获取错误?有多少它们是什么?在doInBackground()中发布logcat.dont set text,如果要设置文本,请将其删除,然后在postExecute()中更改
      onPreExecute() -> doInBackground() -> onPostExecute()