Php 异步任务中的Http请求

Php 异步任务中的Http请求,php,android,mysql,android-asynctask,httprequest,Php,Android,Mysql,Android Asynctask,Httprequest,我正在尝试制作一个应用程序,在应用程序中使用用户名和密码,并使用http请求将它们发送到mysql数据库,在检查数据库后,如果用户存在,我会看到文本视图中显示的文本在应用程序中说“正确的用户名和密码”,如果不存在,我会看到显示的文本“用户名或密码不正确” 我既看不到正确的,也看不到不正确的。单击“登录”按钮后,我看不到任何内容 <EditText android:id="@+id/u" android:layout_width="wrap_content"

我正在尝试制作一个应用程序,在应用程序中使用用户名和密码,并使用http请求将它们发送到mysql数据库,在检查数据库后,如果用户存在,我会看到文本视图中显示的文本在应用程序中说“正确的用户名和密码”,如果不存在,我会看到显示的文本“用户名或密码不正确” 我既看不到正确的,也看不到不正确的。单击“登录”按钮后,我看不到任何内容

     <EditText
     android:id="@+id/u"
     android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="56dp"
    android:ems="10" />

      <EditText
    android:id="@+id/p"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/u"
    android:layout_below="@+id/u"
    android:layout_marginTop="22dp"
    android:ems="10"
    android:inputType="textPassword" />

    <Button
    android:id="@+id/login"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/p"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="67dp"
    android:text="Login" />

    <TextView
    android:id="@+id/res"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/login"
    android:layout_below="@+id/p"
    android:layout_marginTop="27dp"
    android:text="OK"
    android:textAppearance="?android:attr/textAppearanceSmall"
    android:textColor="@android:color/black" />

     </RelativeLayout>`
Logindb类

    public class Logindb extends Activity {
    Button login;
    EditText u, p;
    TextView res;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.logindb);

        login = (Button) findViewById(R.id.login);
        u = (EditText) findViewById(R.id.u);
        p = (EditText) findViewById(R.id.p);
        res = (TextView) findViewById(R.id.res);
        login.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                new MyAsyncTask().execute(u.getText().toString(), p.getText()
                        .toString());
            }
        });
    }

    private class MyAsyncTask extends AsyncTask<String, Integer, Double> {
        @Override
        protected Double doInBackground(String... params) {
            postData(params[0], params[1]);
            return null;
        }

        protected void onPostExecute(Double result) {
            Toast.makeText(getApplicationContext(), "command sent",
                    Toast.LENGTH_LONG).show();
        }

        protected void onProgressUpdate(Integer... progress) {}

        public void postData(String a, String b) {
            ArrayList<NameValuePair> postParameters = new ArrayList<NameValuePair>();
            postParameters.add(new BasicNameValuePair("username", a));
            postParameters.add(new BasicNameValuePair("password", b));

            String response = null;
            try {
                response = CustomHttpClient.executeHttpPost(
                        "http://192.168.1.11/new/check.php", postParameters);
                String result = response.toString();
                result = result.replaceAll("\\s+", "");
                if (!result.equals("0")) {
                    res.setText("A Correct Username and Password");
                }
                else
                    res.setText("Incorrect Username or Password");
            } catch (Exception e) {
                res.setText(e.toString());
            }
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.logindb, menu);
        return true;
    }
}
     <EditText
     android:id="@+id/u"
     android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="56dp"
    android:ems="10" />

      <EditText
    android:id="@+id/p"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/u"
    android:layout_below="@+id/u"
    android:layout_marginTop="22dp"
    android:ems="10"
    android:inputType="textPassword" />

    <Button
    android:id="@+id/login"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/p"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="67dp"
    android:text="Login" />

    <TextView
    android:id="@+id/res"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/login"
    android:layout_below="@+id/p"
    android:layout_marginTop="27dp"
    android:text="OK"
    android:textAppearance="?android:attr/textAppearanceSmall"
    android:textColor="@android:color/black" />

     </RelativeLayout>`
公共类Logindb扩展活动{
按钮登录;
编辑文本u,p;
文本视图资源;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.logindb);
login=(按钮)findviewbyd(R.id.login);
u=(编辑文本)findViewById(R.id.u);
p=(EditText)findViewById(R.id.p);
res=(TextView)findViewById(R.id.res);
login.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
新建MyAsyncTask().execute(u.getText().toString(),p.getText())
.toString());
}
});
}
私有类MyAsyncTask扩展了AsyncTask{
@凌驾
受保护的双doInBackground(字符串…参数){
postData(参数[0],参数[1]);
返回null;
}
受保护的void onPostExecute(双重结果){
Toast.makeText(getApplicationContext(),“已发送命令”,
Toast.LENGTH_LONG).show();
}
受保护的void onProgressUpdate(整数…进度){}
公共void postData(字符串a、字符串b){
ArrayList后参数=新的ArrayList();
添加(新的BasicNameValuePair(“用户名”,a));
添加(新的BasicNameValuePair(“密码”,b));
字符串响应=null;
试一试{
响应=CustomHttpClient.executeHttpPost(
"http://192.168.1.11/new/check.php“,后参数);
字符串结果=response.toString();
结果=结果.replaceAll(\\s+,“”);
如果(!result.equals(“0”)){
res.setText(“正确的用户名和密码”);
}
其他的
res.setText(“不正确的用户名或密码”);
}捕获(例外e){
res.setText(例如toString());
}
}
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
getMenuInflater().充气(R.menu.logindb,menu);
返回true;
}
}
PHP文件check.PHP

     <?php
     $un=$_POST['username'];
     $pw=$_POST['password'];
     //connect to the db

     $host="localhost"; // Host name 
     $user="root"; // Mysql username 
     $pswd="123"; // Mysql password 
     $db="pet_home"; // Database name 
     $tbl_name="users"; // Table name

    $conn = mysql_connect($host, $user, $pswd);
    mysql_select_db($db, $conn);
    //run the query to search for the username and password the match
      $query = "SELECT * FROM $tbl_name WHERE first_name = '$un' AND password = '$pw'";

$result = mysql_query($query) or die("Unable to verify user because : ".mysql_error());
//this is where the actual verification happens
if(mysql_num_rows($result) > 0)
echo mysql_result($result,0);  // for correct login response
else
 echo 0; // for incorrect login response
 ?>
     <EditText
     android:id="@+id/u"
     android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="56dp"
    android:ems="10" />

      <EditText
    android:id="@+id/p"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/u"
    android:layout_below="@+id/u"
    android:layout_marginTop="22dp"
    android:ems="10"
    android:inputType="textPassword" />

    <Button
    android:id="@+id/login"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/p"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="67dp"
    android:text="Login" />

    <TextView
    android:id="@+id/res"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/login"
    android:layout_below="@+id/p"
    android:layout_marginTop="27dp"
    android:text="OK"
    android:textAppearance="?android:attr/textAppearanceSmall"
    android:textColor="@android:color/black" />

     </RelativeLayout>`

它不起作用,因为您正在
doInBackground
中修改文本视图。所有可视修改都必须在
onPostExecute
中调用 因此,这里需要做的是从
postData
返回字符串结果,并在
onpostdecute
中移动以下代码:

     <EditText
     android:id="@+id/u"
     android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="56dp"
    android:ems="10" />

      <EditText
    android:id="@+id/p"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/u"
    android:layout_below="@+id/u"
    android:layout_marginTop="22dp"
    android:ems="10"
    android:inputType="textPassword" />

    <Button
    android:id="@+id/login"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/p"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="67dp"
    android:text="Login" />

    <TextView
    android:id="@+id/res"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/login"
    android:layout_below="@+id/p"
    android:layout_marginTop="27dp"
    android:text="OK"
    android:textAppearance="?android:attr/textAppearanceSmall"
    android:textColor="@android:color/black" />

     </RelativeLayout>`
  if (!result.equals("0")) {
    //  Intent in = new Intent(Logindb.this, Welcome.class);
    // LoadPreferences();
    res.setText("A Correct Username and Password");
    //startActivity(in);
  }
  else
     res.setText("Incorrect Username or Password");

它不起作用,因为您正在
doInBackground
中修改文本视图。所有视觉修改都必须在
onPostExecute
中调用 因此,这里需要做的是从
postData
返回字符串结果,并在
onpostdecute
中移动以下代码:

     <EditText
     android:id="@+id/u"
     android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="56dp"
    android:ems="10" />

      <EditText
    android:id="@+id/p"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/u"
    android:layout_below="@+id/u"
    android:layout_marginTop="22dp"
    android:ems="10"
    android:inputType="textPassword" />

    <Button
    android:id="@+id/login"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/p"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="67dp"
    android:text="Login" />

    <TextView
    android:id="@+id/res"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/login"
    android:layout_below="@+id/p"
    android:layout_marginTop="27dp"
    android:text="OK"
    android:textAppearance="?android:attr/textAppearanceSmall"
    android:textColor="@android:color/black" />

     </RelativeLayout>`
  if (!result.equals("0")) {
    //  Intent in = new Intent(Logindb.this, Welcome.class);
    // LoadPreferences();
    res.setText("A Correct Username and Password");
    //startActivity(in);
  }
  else
     res.setText("Incorrect Username or Password");

我很惊讶这能工作,并且没有崩溃,您正试图从doInBackground(通过在postData中调用res.setText)访问UI,这是不可能的。您应该在doInBackground中返回一个布尔值,并根据此,在onPostExecute中相应地更改TextView

     <EditText
     android:id="@+id/u"
     android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="56dp"
    android:ems="10" />

      <EditText
    android:id="@+id/p"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/u"
    android:layout_below="@+id/u"
    android:layout_marginTop="22dp"
    android:ems="10"
    android:inputType="textPassword" />

    <Button
    android:id="@+id/login"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/p"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="67dp"
    android:text="Login" />

    <TextView
    android:id="@+id/res"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/login"
    android:layout_below="@+id/p"
    android:layout_marginTop="27dp"
    android:text="OK"
    android:textAppearance="?android:attr/textAppearanceSmall"
    android:textColor="@android:color/black" />

     </RelativeLayout>`
将其用作类定义:

     <EditText
     android:id="@+id/u"
     android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="56dp"
    android:ems="10" />

      <EditText
    android:id="@+id/p"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/u"
    android:layout_below="@+id/u"
    android:layout_marginTop="22dp"
    android:ems="10"
    android:inputType="textPassword" />

    <Button
    android:id="@+id/login"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/p"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="67dp"
    android:text="Login" />

    <TextView
    android:id="@+id/res"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/login"
    android:layout_below="@+id/p"
    android:layout_marginTop="27dp"
    android:text="OK"
    android:textAppearance="?android:attr/textAppearanceSmall"
    android:textColor="@android:color/black" />

     </RelativeLayout>`
private class MyAsyncTask extends AsyncTask<String, Integer, Boolean>
在doInBackground:

     <EditText
     android:id="@+id/u"
     android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="56dp"
    android:ems="10" />

      <EditText
    android:id="@+id/p"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/u"
    android:layout_below="@+id/u"
    android:layout_marginTop="22dp"
    android:ems="10"
    android:inputType="textPassword" />

    <Button
    android:id="@+id/login"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/p"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="67dp"
    android:text="Login" />

    <TextView
    android:id="@+id/res"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/login"
    android:layout_below="@+id/p"
    android:layout_marginTop="27dp"
    android:text="OK"
    android:textAppearance="?android:attr/textAppearanceSmall"
    android:textColor="@android:color/black" />

     </RelativeLayout>`
boolean success = postData(params[0],params[1]);
return success;
最后

     <EditText
     android:id="@+id/u"
     android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="56dp"
    android:ems="10" />

      <EditText
    android:id="@+id/p"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/u"
    android:layout_below="@+id/u"
    android:layout_marginTop="22dp"
    android:ems="10"
    android:inputType="textPassword" />

    <Button
    android:id="@+id/login"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/p"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="67dp"
    android:text="Login" />

    <TextView
    android:id="@+id/res"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/login"
    android:layout_below="@+id/p"
    android:layout_marginTop="27dp"
    android:text="OK"
    android:textAppearance="?android:attr/textAppearanceSmall"
    android:textColor="@android:color/black" />

     </RelativeLayout>`
protected void onPostExecute(Boolean result){
    // change the text for your TextViews here according to the Boolean result
    if (result){
        res.setText("A Correct Username and Password");
    }else{
        res.setText("Incorrect Username or Password");
    }
    Toast.makeText(getApplicationContext(), "command sent", Toast.LENGTH_LONG).show();
}

我很惊讶这能工作,并且没有崩溃,您正试图从doInBackground(通过在postData中调用res.setText)访问UI,这是不可能的。您应该在doInBackground中返回一个布尔值,并根据此,在onPostExecute中相应地更改TextView

     <EditText
     android:id="@+id/u"
     android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="56dp"
    android:ems="10" />

      <EditText
    android:id="@+id/p"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/u"
    android:layout_below="@+id/u"
    android:layout_marginTop="22dp"
    android:ems="10"
    android:inputType="textPassword" />

    <Button
    android:id="@+id/login"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/p"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="67dp"
    android:text="Login" />

    <TextView
    android:id="@+id/res"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/login"
    android:layout_below="@+id/p"
    android:layout_marginTop="27dp"
    android:text="OK"
    android:textAppearance="?android:attr/textAppearanceSmall"
    android:textColor="@android:color/black" />

     </RelativeLayout>`
将其用作类定义:

     <EditText
     android:id="@+id/u"
     android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="56dp"
    android:ems="10" />

      <EditText
    android:id="@+id/p"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/u"
    android:layout_below="@+id/u"
    android:layout_marginTop="22dp"
    android:ems="10"
    android:inputType="textPassword" />

    <Button
    android:id="@+id/login"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/p"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="67dp"
    android:text="Login" />

    <TextView
    android:id="@+id/res"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/login"
    android:layout_below="@+id/p"
    android:layout_marginTop="27dp"
    android:text="OK"
    android:textAppearance="?android:attr/textAppearanceSmall"
    android:textColor="@android:color/black" />

     </RelativeLayout>`
private class MyAsyncTask extends AsyncTask<String, Integer, Boolean>
在doInBackground:

     <EditText
     android:id="@+id/u"
     android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="56dp"
    android:ems="10" />

      <EditText
    android:id="@+id/p"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/u"
    android:layout_below="@+id/u"
    android:layout_marginTop="22dp"
    android:ems="10"
    android:inputType="textPassword" />

    <Button
    android:id="@+id/login"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/p"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="67dp"
    android:text="Login" />

    <TextView
    android:id="@+id/res"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/login"
    android:layout_below="@+id/p"
    android:layout_marginTop="27dp"
    android:text="OK"
    android:textAppearance="?android:attr/textAppearanceSmall"
    android:textColor="@android:color/black" />

     </RelativeLayout>`
boolean success = postData(params[0],params[1]);
return success;
最后

     <EditText
     android:id="@+id/u"
     android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="56dp"
    android:ems="10" />

      <EditText
    android:id="@+id/p"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/u"
    android:layout_below="@+id/u"
    android:layout_marginTop="22dp"
    android:ems="10"
    android:inputType="textPassword" />

    <Button
    android:id="@+id/login"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/p"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="67dp"
    android:text="Login" />

    <TextView
    android:id="@+id/res"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/login"
    android:layout_below="@+id/p"
    android:layout_marginTop="27dp"
    android:text="OK"
    android:textAppearance="?android:attr/textAppearanceSmall"
    android:textColor="@android:color/black" />

     </RelativeLayout>`
protected void onPostExecute(Boolean result){
    // change the text for your TextViews here according to the Boolean result
    if (result){
        res.setText("A Correct Username and Password");
    }else{
        res.setText("Incorrect Username or Password");
    }
    Toast.makeText(getApplicationContext(), "command sent", Toast.LENGTH_LONG).show();
}

当您执行任何类型的网络操作时,您必须使用thread/asynctask来执行此操作。另一方面,当您必须访问或修改任何UI元素时,您必须在MainThread(UIThread)中执行此操作。 现在,您要做的是从非UIThread的线程内部调用res.setText()。 AsyncTask由两个方法组成,其中一些方法在UIThread中运行,如onPostExecute、onProgressUpdate..但doInBackground不在UIThread中运行,这就是您面临此问题的原因

     <EditText
     android:id="@+id/u"
     android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="56dp"
    android:ems="10" />

      <EditText
    android:id="@+id/p"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/u"
    android:layout_below="@+id/u"
    android:layout_marginTop="22dp"
    android:ems="10"
    android:inputType="textPassword" />

    <Button
    android:id="@+id/login"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/p"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="67dp"
    android:text="Login" />

    <TextView
    android:id="@+id/res"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/login"
    android:layout_below="@+id/p"
    android:layout_marginTop="27dp"
    android:text="OK"
    android:textAppearance="?android:attr/textAppearanceSmall"
    android:textColor="@android:color/black" />

     </RelativeLayout>`
为了解决您的问题,您现在可以按照其他答案进行操作,因为他们建议实际应该采用哪种方法来处理此问题。在这种情况下,您必须调整代码以使其像这样工作

     <EditText
     android:id="@+id/u"
     android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="56dp"
    android:ems="10" />

      <EditText
    android:id="@+id/p"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/u"
    android:layout_below="@+id/u"
    android:layout_marginTop="22dp"
    android:ems="10"
    android:inputType="textPassword" />

    <Button
    android:id="@+id/login"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/p"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="67dp"
    android:text="Login" />

    <TextView
    android:id="@+id/res"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/login"
    android:layout_below="@+id/p"
    android:layout_marginTop="27dp"
    android:text="OK"
    android:textAppearance="?android:attr/textAppearanceSmall"
    android:textColor="@android:color/black" />

     </RelativeLayout>`
此外,还有一种方法可以解决问题,但遗憾的是,它消除了使用asynctask的必要性,因为您没有利用asynctask的任何优势,您可以使用线程来代替

     <EditText
     android:id="@+id/u"
     android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="56dp"
    android:ems="10" />

      <EditText
    android:id="@+id/p"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/u"
    android:layout_below="@+id/u"
    android:layout_marginTop="22dp"
    android:ems="10"
    android:inputType="textPassword" />

    <Button
    android:id="@+id/login"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/p"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="67dp"
    android:text="Login" />

    <TextView
    android:id="@+id/res"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/login"
    android:layout_below="@+id/p"
    android:layout_marginTop="27dp"
    android:text="OK"
    android:textAppearance="?android:attr/textAppearanceSmall"
    android:textColor="@android:color/black" />

     </RelativeLayout>`
当您从postData内部(参数[0],参数[1])对任何UI元素进行任何修改时,请使用runOnUiThread

     <EditText
     android:id="@+id/u"
     android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="56dp"
    android:ems="10" />

      <EditText
    android:id="@+id/p"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/u"
    android:layout_below="@+id/u"
    android:layout_marginTop="22dp"
    android:ems="10"
    android:inputType="textPassword" />

    <Button
    android:id="@+id/login"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/p"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="67dp"
    android:text="Login" />

    <TextView
    android:id="@+id/res"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/login"
    android:layout_below="@+id/p"
    android:layout_marginTop="27dp"
    android:text="OK"
    android:textAppearance="?android:attr/textAppearanceSmall"
    android:textColor="@android:color/black" />

     </RelativeLayout>`
像这样:

     <EditText
     android:id="@+id/u"
     android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="56dp"
    android:ems="10" />

      <EditText
    android:id="@+id/p"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/u"
    android:layout_below="@+id/u"
    android:layout_marginTop="22dp"
    android:ems="10"
    android:inputType="textPassword" />

    <Button
    android:id="@+id/login"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/p"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="67dp"
    android:text="Login" />

    <TextView
    android:id="@+id/res"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/login"
    android:layout_below="@+id/p"
    android:layout_marginTop="27dp"
    android:text="OK"
    android:textAppearance="?android:attr/textAppearanceSmall"
    android:textColor="@android:color/black" />

     </RelativeLayout>`
   runOnUiThread(new Runnable() {

                    public void run() {
                        // TODO Auto-generated method stub
                        // do what you have to do
                     res.setText("A Correct Username and Password");
                    }
            });

尝试这种方式,它应该可以工作。

当您执行任何类型的网络操作时,您必须使用thread/asynctask来完成此操作。另一方面,当您必须访问或修改任何UI元素时,您必须在MainThread(UIThread)中执行此操作。
     <EditText
     android:id="@+id/u"
     android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="56dp"
    android:ems="10" />

      <EditText
    android:id="@+id/p"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/u"
    android:layout_below="@+id/u"
    android:layout_marginTop="22dp"
    android:ems="10"
    android:inputType="textPassword" />

    <Button
    android:id="@+id/login"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/p"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="67dp"
    android:text="Login" />

    <TextView
    android:id="@+id/res"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/login"
    android:layout_below="@+id/p"
    android:layout_marginTop="27dp"
    android:text="OK"
    android:textAppearance="?android:attr/textAppearanceSmall"
    android:textColor="@android:color/black" />

     </RelativeLayout>`
现在,您要做的是从非UIThread的线程内部调用res.setText()。 AsyncTask由两个方法组成,其中一些方法在UIThread中运行,如onPostExecute、onProgressUpdate..但doInBackground不在UIThread中运行,这就是您面临此问题的原因

     <EditText
     android:id="@+id/u"
     android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="56dp"
    android:ems="10" />

      <EditText
    android:id="@+id/p"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/u"
    android:layout_below="@+id/u"
    android:layout_marginTop="22dp"
    android:ems="10"
    android:inputType="textPassword" />

    <Button
    android:id="@+id/login"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/p"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="67dp"
    android:text="Login" />

    <TextView
    android:id="@+id/res"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/login"
    android:layout_below="@+id/p"
    android:layout_marginTop="27dp"
    android:text="OK"
    android:textAppearance="?android:attr/textAppearanceSmall"
    android:textColor="@android:color/black" />

     </RelativeLayout>`
为了解决你的问题,你现在可以按照其他答案去做,因为他们建议哪种方法才是解决问题的方法