您好,我只是想获取适用于 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/