【发布时间】:2015-11-20 20:32:55
【问题描述】:
我正在使用连接到在线数据库的 Android 应用程序的登录系统。如果我要显示 onPostExecute() 提供的结果,它可以工作,但如果我要将它放在条件语句上做某事,它就不起作用;或者我应该说,它正在工作,但它正在无限地工作。
得到字符串结果后如何停止执行onPostExecute?
无论如何,这是我的代码:
登录.php
package com.example.navigationdrawerexample;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
public class Login extends Activity implements OnClickListener, Connector.OnPostExecuteListener{
EditText studnum;
EditText pass;
Button login;
Button reg;
TextView errorlog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login);
studnum = (EditText) findViewById(R.id.studnum);
pass = (EditText) findViewById(R.id.password);
login = (Button) findViewById(R.id.login);
reg = (Button) findViewById(R.id.register);
errorlog = (TextView) findViewById(R.id.errorlog);
login.setOnClickListener(this);
}
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
if (arg0.getId() == R.id.login){
ConnectivityManager conv = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mWifi = conv.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
if (!(mWifi.isConnected())){
Toast.makeText(this, "Enable your internet connection first!", Toast.LENGTH_LONG).show();
} else {
String student_num = studnum.getText().toString();
String password = pass.getText().toString();
Connector connect= new Connector(this,0,"authenticate",0,0,0,student_num,password);
connect.setOnPostExecuteListener(this);
connect.execute("");
}
}
}
@Override
public void onPostExecute(String result) {
// TODO Auto-generated method stub
if (result == "false"){
errorlog.setText("Incorrect login information..");
} else if (result == "true"){
Intent goToLogInMod = new Intent("com.example.navigationdrawerexample.MAINACTIVITY");
startActivity(goToLogInMod); //para pumunta sa login module
}
}
}
Connector.php 如果您注意到一些无用的构造函数参数,请忽略它:)
package com.example.navigationdrawerexample;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URI;
import java.net.URL;
import java.util.ArrayList;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.ProgressDialog;
import android.content.Context;
import android.graphics.Typeface;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
public class Connector extends AsyncTask<String,Void,String>{
private OnPostExecuteListener onPostExecuteListener;
private Context context;
private int collegeactive;
private String flag;
private int spec_art;
private String response;
private int month;
private int yr;
private String username;
private String password;
public Connector(Context context,int college, String flag,int spec_art,int month, int yr,String username, String password){
this.context = context;
this.collegeactive = college;
this.flag = flag;
this.spec_art = spec_art;
this.yr = yr;
this.month = month;
this.username = username;
this.password = password;
}
public interface OnPostExecuteListener {
void onPostExecute(String result);
}
public void setOnPostExecuteListener(OnPostExecuteListener listener){
this.onPostExecuteListener = listener;
}
protected void onPreExecute(){
if (flag == "authenticate"){
Toast.makeText(context, "Please wait...", Toast.LENGTH_LONG).show();
}
}
@Override
protected String doInBackground(String... arg0) {
// TODO Auto-generated method stub
try{
String link = "";
if (flag == "headline"){
link = "http://rtu-astronet.com/emag/functions.php?action=printHeadline&coll_id="+collegeactive;
} else if (flag == "list"){
link = "http://rtu-astronet.com/emag/functions.php?action=printArticlePerCollege&collegeid="+collegeactive+"&acadornot=1";
} else if (flag == "spec_article"){
link = "http://rtu-astronet.com/emag/functions.php?action=printSpecificArticle&articleid="+spec_art;
} else if (flag == "permonth"){
link = "http://rtu-astronet.com/emag/functions.php?action=printArticlePerMonth&month="+month+"&year="+yr+"&acadornot=1";
} else if (flag == "authenticate"){
link = "http://rtu-astronet.com/emag/functions.php?action=checkAccount&username="+username+"&password="+password;
}
URL url = new URL(link);
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet();
request.setURI(new URI(link));
HttpResponse response = client.execute(request);
BufferedReader in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
StringBuffer sb = new StringBuffer("");
String line = "";
while ((line = in.readLine()) != null) {
sb.append(line);
//break;
}
in.close();
return sb.toString();
} catch(Exception e){
return new String("Exception: " + e.getMessage());
}
}
@Override
protected void onPostExecute(String result) {
if (flag != "authenticate"){
result = "{ \n \"Data\": \n " + result + " \n }";
}
if(onPostExecuteListener !=null){
onPostExecuteListener.onPostExecute(result);
}
}
}
【问题讨论】:
-
你是说点击登录按钮一次后,onPostExecute()方法会被多次调用?
-
我认为是这样,或者它被调用了一次但执行永远不会结束。这就是为什么我能够显示数据但不能将其放在条件语句中。
-
也许你可以在登录活动中打印出字符串结果,看看它是否只被调用过一次,值是否正确。除此之外,我真的不确定这里可能存在什么问题。
-
请不要使用 StringBuffer,因为它在十多年前被 StringBuilder 取代,即。在 Android 出现之前。
标签: java android android-asynctask