編輯:關於Android編程
最近開發過過成中遇到一些小問題,比如一個btn點擊用戶可能只點擊了一次但是後台響應了多次,像一些表單的提交出現這種問題比較棘手,當然解決這種問題的方案比較多:比如自定義單次點擊的btn,或者在點擊的時候將按鈕設置為不可點擊,或者做一個計時器等等,這些都是解決的方案,至於具體怎麼使用,這就要看程序員的編碼風格了,首先來看看具體問題:
onClick事件是Android開發中最常見的事件。比如,一個Button,功能是點擊會提交一個訂單,則一般代碼如下 :
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
submitOrder();
}
});
正常情況下這段代碼是沒什麼問題的,但是Android設備的機型性能等千差萬別,如果碰到比較卡的手機,則有可能出現submitOrder()函數跳轉頁面出現延遲的現象。碰到這種現象,則用戶就很有可能再次點擊一次,從而造成函數被調用兩次,出現重復訂單的BUG。 一般地,碰到這現象,首先就會想到的就是在點擊之後把submitButton設置為不可點擊:
//代碼 btn.setClickable(false); //或者 btn.setEnabled(false);
此方法也確實有效,不過如果submitOrder()方法沒有成功,需要再次提交訂單時又需要再重復把submitButton設置為可點擊狀態。如果類似的button比較多時,就顯得比較麻煩、混亂。
下面介紹一下我的處理方法:
自定義一個CheckDoubleClickListener,繼承自OnClickListener,其中的OnCheckDoubleClick是自定義的一個接口,具體看代碼:
CheckDoubleClickListener.Java
package com.huaxia.finance.javastudy.CheckDoubleClick;
import android.view.View;
import java.util.Calendar;
/**
*
* Created by lp on 2016/12/29.
*/
public class CheckDoubleClickListener implements View.OnClickListener {
public static final int MIN_CLICK_DELAY_TIME = 1000;
private long lastClickTime = 0;
private OnCheckDoubleClick checkDoubleClick;
public CheckDoubleClickListener(OnCheckDoubleClick checkDoubleClick){
this.checkDoubleClick = checkDoubleClick;
}
@Override
public void onClick(View v) {
long currentTime = Calendar.getInstance().getTimeInMillis();
if (currentTime - lastClickTime > MIN_CLICK_DELAY_TIME) {
lastClickTime = currentTime;
checkDoubleClick.onCheckDoubleClick(v);
}
}
}
OnCheckDoubleClick.java
package com.huaxia.finance.javastudy.CheckDoubleClick;
import android.view.View;
/**
* Created by lp on 2016/12/29.
*/
public interface OnCheckDoubleClick {
void onCheckDoubleClick(View view);
}
使用方法:
給btn設置點擊事件時用CheckDoubleClickListener代替OnClickListener,並且實現方法onCheckDoubleClick代替onClick即可,像這樣:
package com.huaxia.finance.javastudy;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import com.huaxia.finance.javastudy.CheckDoubleClick.CheckDoubleClickListener;
import com.huaxia.finance.javastudy.CheckDoubleClick.OnCheckDoubleClick;
public class CheckDoubleClickActivity extends Activity implements OnCheckDoubleClick {
private Button btn;
private CheckDoubleClickListener checkDoubleClickListener;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_check_double_click);
checkDoubleClickListener = new CheckDoubleClickListener(this);
btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(checkDoubleClickListener);
}
@Override
public void onCheckDoubleClick(View view) {
Toast.makeText(CheckDoubleClickActivity.this, "Click Response", Toast.LENGTH_SHORT).show();
}
}
原理:
就是用onCheckDoubleClick代替onClick處理具體的操作,在onClick方法中加一個判斷:在接收到點擊事件之後,先判斷一下時間,如果距離上次處理操作不足MIN_CLICK_DELAY_TIME,就忽視——即能防止誤操作的連續點擊導致重復事件。MIN_CLICK_DELAY_TIME可調。
優勢:
好處是不用改變原有代碼的邏輯,就只需要兩個替換:CheckDoubleClickListener代替OnClickListener,onCheckDoubleClick代替onClick。 代碼的結構等都不需要做改變,不需要關心處理更改btn的狀態這些額外判斷邏輯,只需要關注業務邏輯即可,代碼是不是變得很簡潔了呢?一起加油吧。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持本站。
Android -- 跨應用綁定service並通信
第一步,需要修改service1項目中aidl,增加一個方法。package com.example.service1.aidl; interface IM
手機QQ2015收藏的內容怎麼轉發給別人
1:登陸到聊天界面去。這裡我用對方發來的qq表情位例子。按住你所想要收藏的地方。就會自己出現了收藏選擇。2:然後回到主頁面,點擊右下角的"我&qu
《Android Studio實用指南》4.27 使用演示模式
目前本書已上傳到百度閱讀, 在百度中搜索[Anroid Studio實用指南]便可以找到本書.什麼是演示模式?顧名思義,當你想給別人演示你的代碼時就會用到這個演示模式.演
Android最新版本開發環境搭建圖文教程
本文只是寫了如何配置JDK,以及adt-bundle的配置。對於以前的adt-bundle的版本,會自帶CPU/ABI系統鏡像,經過本文所描述的兩個步驟後可以直接創建AV