Android 多次单击按钮时重复启动的活动
我在主活动上有一个登录按钮,它执行一个aysncTask,在PostExecute上启动另一个活动,但是当用户多次单击该按钮时 它会多次启动该活动,如何防止这种情况发生 这是我的onClick侦听器:Android 多次单击按钮时重复启动的活动,android,android-asynctask,Android,Android Asynctask,我在主活动上有一个登录按钮,它执行一个aysncTask,在PostExecute上启动另一个活动,但是当用户多次单击该按钮时 它会多次启动该活动,如何防止这种情况发生 这是我的onClick侦听器: loginButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (I
loginButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (IP != "null") {
password = enterPassword.getText().toString();
progressB.setVisibility(View.VISIBLE);
new httpLogin().execute();}
else {
Toast.makeText(getApplicationContext(), "please enter H2O host address before attempting to login", Toast.LENGTH_LONG).show();
}
}
});
这是异步任务代码:
public class httpLogin extends AsyncTask<Void,Void,String> {
String rs,result;
JSONArray jArray;
boolean r,isConnected;
@Override
protected void onPreExecute() {
super.onPreExecute();
progressB.setProgress(0);
isConnected=isOnline();
}
@Override
protected String doInBackground(Void... params) {
try {
String link = "http://"+IP+"/H2O.asmx/Check_Waiter?Password="+password;
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet();
request.setURI(new URI(link));
HttpResponse response = client.execute(request);
BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8"), 8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
result = sb.toString();
String[] separated = result.split(">");
JSONObject jObject = new JSONObject(separated[2]);
jArray = jObject.getJSONArray("Waiter");
if(jArray.length()>0) {
JSONObject json_data = jArray.getJSONObject(0);
waiterID = json_data.getString("UserNo");
waiterName = json_data.getString("UserName");
r=true;
}
else r=false;
rs = "sucessful";
} catch (Exception e) {
rs = "Fail";
}
return rs;
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
if(isConnected)
if (r) {
Toast.makeText(getApplicationContext(), "User ID:" + waiterID + "\n Username:" + waiterName, Toast.LENGTH_SHORT).show();
Intent intentFSelector = new Intent(MainActivity.this, FloorSelector.class);
startActivity(intentFSelector);
}
}
尝试此操作并在您的意图中插入:
intent.addFlags(intent.FLAG\u ACTIVITY\u REORDER\u TO\u FRONT)代码>尝试此操作并在您的意图中插入:
intent.addFlags(intent.FLAG\u ACTIVITY\u REORDER\u TO\u FRONT)代码>在执行异步任务后禁用该按钮
if (IP != "null") {
password = enterPassword.getText().toString();
progressB.setVisibility(View.VISIBLE);
new httpLogin().execute();
((Button) view).setEnabled(false);
}
理想情况下,您应该直接调用按钮上的startActivity()
,单击并执行onCreate()中的AsyncTask
。下载数据时,您将在其中一个数据视图中显示“加载…”。完成后,您将更新onPostExecute()
中的视图,或者在下载失败时显示错误消息;假设用户处于脱机状态。在执行异步任务后禁用该按钮
if (IP != "null") {
password = enterPassword.getText().toString();
progressB.setVisibility(View.VISIBLE);
new httpLogin().execute();
((Button) view).setEnabled(false);
}
理想情况下,您应该直接调用按钮上的startActivity()
,单击并执行onCreate()中的AsyncTask
。下载数据时,您将在其中一个数据视图中显示“加载…”。完成后,您将更新onPostExecute()
中的视图,或者在下载失败时显示错误消息;说明用户是否处于脱机状态。使用ProgressDialog可以避免多次单击登录按钮
ProgressDialog authProgressDialog;
在异步任务中
public class httpLogin extends AsyncTask<Void,Void,String> {
String rs,result;
JSONArray jArray;
boolean r,isConnected;
@Override
protected void onPreExecute() {
super.onPreExecute();
authProgressDialog = ProgressDialog.show(MainActivity.this, "", "Loading....", true, false);
}
protected Object doInBackground(Object... params) {
//your code
}
protected void onPostExecute(Object result){
if (authProgressDialog!=null) {
if (authProgressDialog.isShowing()) {
authProgressDialog.dismiss();
}
}
}
}
公共类httpLogin扩展异步任务{
字符串rs,结果;
杰索纳雷·贾雷;
布尔r,不连通;
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
authProgressDialog=ProgressDialog.show(MainActivity.this,“,”加载…”,true,false);
}
受保护对象doInBackground(对象…参数){
//你的代码
}
受保护的void onPostExecute(对象结果){
如果(authProgressDialog!=null){
if(authProgressDialog.isShowing()){
authProgressDialog.disclose();
}
}
}
}
当您单击按钮时,将显示一个进度对话框,此对话框将在执行AsyncTask后关闭。您可以使用ProgressDialog避免多次单击登录按钮
ProgressDialog authProgressDialog;
public class httpLogin extends AsyncTask<Void,Void,String> {
String rs,result;
JSONArray jArray;
boolean r,isConnected;
@Override
protected void onPreExecute() {
super.onPreExecute();
authProgressDialog = ProgressDialog.show(MainActivity.this, "", "Loading....", true, false);
}
protected Object doInBackground(Object... params) {
//your code
}
protected void onPostExecute(Object result){
if (authProgressDialog!=null) {
if (authProgressDialog.isShowing()) {
authProgressDialog.dismiss();
}
}
}
}
在异步任务中
public class httpLogin extends AsyncTask<Void,Void,String> {
String rs,result;
JSONArray jArray;
boolean r,isConnected;
@Override
protected void onPreExecute() {
super.onPreExecute();
authProgressDialog = ProgressDialog.show(MainActivity.this, "", "Loading....", true, false);
}
protected Object doInBackground(Object... params) {
//your code
}
protected void onPostExecute(Object result){
if (authProgressDialog!=null) {
if (authProgressDialog.isShowing()) {
authProgressDialog.dismiss();
}
}
}
}
公共类httpLogin扩展异步任务{
字符串rs,结果;
杰索纳雷·贾雷;
布尔r,不连通;
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
authProgressDialog=ProgressDialog.show(MainActivity.this,“,”加载…”,true,false);
}
受保护对象doInBackground(对象…参数){
//你的代码
}
受保护的void onPostExecute(对象结果){
如果(authProgressDialog!=null){
if(authProgressDialog.isShowing()){
authProgressDialog.disclose();
}
}
}
}
当您单击按钮时,将显示一个进度对话框,此对话框将在执行AsyncTask后关闭谢谢。我使用了setEnabled(false),至于setClickable它不起作用,按钮仍然可以点击多次。好的,谢谢分享。我查看了文档,似乎setClickable()只会在视觉上影响按钮,即单击时是否应将其视为按下。谢谢。我使用了setEnabled(false),至于setClickable它不起作用,按钮仍然可以点击多次。好的,谢谢分享。我检查了文档,似乎setClickable()只会在视觉上影响按钮,即单击时是否应将其视为按下。
public class httpLogin extends AsyncTask<Void,Void,String> {
String rs,result;
JSONArray jArray;
boolean r,isConnected;
@Override
protected void onPreExecute() {
super.onPreExecute();
authProgressDialog = ProgressDialog.show(MainActivity.this, "", "Loading....", true, false);
}
protected Object doInBackground(Object... params) {
//your code
}
protected void onPostExecute(Object result){
if (authProgressDialog!=null) {
if (authProgressDialog.isShowing()) {
authProgressDialog.dismiss();
}
}
}
}