java - 扩展 Asynctask 的类的实例不能完全工作

标签 java android android-asynctask

您好,我只是想获取适用于 Android 的用户登录和注册表单,但我遇到了一个小问题,我无法理解它。我对编程还很陌生,所以请多多包涵。

我有一个主 Activity 类和一个扩展 AsyncTask 并连接到 PHP 文件的注册 Activity 类。 当我将详细信息发送到 PHP 文件时,我收到一个或零的响应,指示用户是否存在。 在我的主要方法中,我通过创建 Register 类的一个实例来执行它,如果电子邮件不存在,则用户凭据将存储到数据库中,如果它确实存在,则不会。 我的问题是我得到的响应似乎没有通过使用 getter 和 setter 转移回我的主类。 我已经在 Register 类中测试了响应,返回了“1”或“0”,但是通过从主类调用 getter 来访问响应,返回了 null。 此外,在 Register 类打印值之前,logcat 的输出从主类打印出来。 如果有人可以提供帮助,我将不胜感激。

package com.eanna.UserLogin;

import java.util.ArrayList;
import java.util.List;

import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class Main extends Activity  {

private EditText username;
private EditText firstname;
private EditText surname;
private EditText password;
private EditText email;
private Button register;
private ProgressDialog pDialog;




@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

     username=(EditText) findViewById(R.id.editText1);
     firstname=(EditText) findViewById(R.id.editText2);
     surname=(EditText) findViewById(R.id.editText3);
     password=(EditText) findViewById(R.id.editText4);
     email=(EditText) findViewById(R.id.editText5);
    register=(Button) findViewById(R.id.button1);

}

        public void register(View v) {


            String usernameStr = username.getText().toString();
            String firstnameStr = firstname.getText().toString();
            String surnameStr = surname.getText().toString();
            String passwordStr = password.getText().toString();
            String emailStr = email.getText().toString();


              register registerInst = new register();
                  registerInst.execute(usernameStr,firstnameStr,surnameStr,passwordStr,emailStr);
              System.out.println("Response Value(main class) is: "+registerInst.getValue() );

        }


}

我的注册类

package com.eanna.UserLogin;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.URI;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;

import android.os.AsyncTask;

public class register extends AsyncTask<String, Void, String> {


    String value;

@Override
protected String doInBackground(String... arg0) {
    // TODO Auto-generated method stub
     try{
            String username = (String)arg0[0];
            String firstname = (String)arg0[1];
            String surname = (String)arg0[2];
            String password = (String)arg0[3];
            String email = (String)arg0[4];


            String link = "http://randomsite.com/randomphpfile.php";
            String data=URLEncoder.encode("username", "UTF-8")
                    + "=" + URLEncoder.encode(username, "UTF-8");
            data+="&"+URLEncoder.encode("firstname", "UTF-8")
                    + "=" + URLEncoder.encode(firstname, "UTF-8");
            data+="&"+URLEncoder.encode("surname", "UTF-8")
                    + "=" + URLEncoder.encode(surname, "UTF-8");
            data+="&"+URLEncoder.encode("password", "UTF-8")
                    + "=" + URLEncoder.encode(password, "UTF-8");
            data+="&"+URLEncoder.encode("email", "UTF-8")
                    + "=" + URLEncoder.encode(email, "UTF-8");


            URL url = new URL(link);

            URLConnection conn = url.openConnection(); 
            conn.setDoOutput(true);
            OutputStreamWriter wr = new OutputStreamWriter
            (conn.getOutputStream()); 

            wr.write( data ); 
            wr.flush(); 
            BufferedReader reader = new BufferedReader
            (new InputStreamReader(conn.getInputStream()));
            StringBuilder sb = new StringBuilder();
            String line = null;
//               Read Server Response
            while((line = reader.readLine()) != null)
            {
               sb.append(line);
               break;
            }


            return sb.toString();
         }catch(Exception e){
            return new String("Exception: " + e.getMessage());
         }

      }
 @Override
   protected void onPostExecute(String result){
      setValue(result);
      System.out.println("Response Value (Register class) is: "+result);

   }


 public void setValue(String value){
     this.value=value;

 }

 public String getValue(){
     return value;
 }

}

这是我的输出

03-03 19:53:12.302: D/libEGL(1091): loaded /system/lib/egl/libEGL_emulation.so
03-03 19:53:12.312: D/(1091): HostConnection::get() New Host Connection established 0x2a1f1df8, tid 1091
03-03 19:53:12.392: D/libEGL(1091): loaded /system/lib/egl/libGLESv1_CM_emulation.so
03-03 19:53:12.405: D/libEGL(1091): loaded /system/lib/egl/libGLESv2_emulation.so
03-03 19:53:12.482: W/EGL_emulation(1091): eglSurfaceAttrib not implemented
03-03 19:53:12.492: D/OpenGLRenderer(1091): Enabling debug mode 0
03-03 19:53:12.562: D/dalvikvm(1091): GC_FOR_ALLOC freed 78K, 8% free 2942K/3176K, paused 47ms, total 51ms
03-03 19:53:17.623: I/System.out(1091): Response Value(main class) is: null
03-03 19:53:18.049: I/System.out(1091): Response Value (Register class) is: 1

它首先输出主类 system.out,即使它应该在

之后执行

"registerInst.execute(usernameStr,firstnameStr,surnameStr,passwordStr,emailStr);"

感谢您的帮助。

最佳答案

首先要小心你的register 变量。您首先将其定义为

register=(Button) findViewById(R.id.button1);

然后作为

register registerInst = new register();

这不一定是错误,但绝对是不好的做法

你说的它首先输出主类 system.out,即使它应该在......之后执行不是错误。 AsyncTask(例如您的 register 变量)在后台的单独线程上运行。当您调用 execute 时,无法保证线程将如何并发执行。最终,这就是 AsyncTask 的设计目的,可以在不阻塞主线程的情况下进行一些繁重的处理(网络请求......)!

关于java - 扩展 Asynctask 的类的实例不能完全工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22160865/

相关文章:

android - 已根据通知打开 Activity

Android 从 AsyncTask 更新 UI 线程的最佳方式

Android Java AsyncTask isCancelled 问题

java - Apache Camel JMS 内存泄漏?

java - 排序方法无法正常工作

android - 如何访问 list 中声明的​​组件实例(广播接收器)

java - 如何处理 BroadcastReceiver 中的多个警报

java - 避免应用程序在捕获异常时崩溃

java - 如何使用 apache.commons.net.ftps 配置客户端身份验证?

java - 在 Java 中查找内存使用情况