android应用程序通过RESTfulWebService向服务器发送重复记录
我创建了一个应用程序,服务每5分钟运行一次,从sqlite获取记录并将其发送到服务器并更新sqlite中的状态,问题出现在sql server数据库中,其中一行被多次插入 我不知道是什么原因导致了这个问题,在调试我的代码时,我注意到当向服务器发送一行调试器时,调试器进入了计时器的内置类,并再次发送相同的记录,我感觉计时器正在一次又一次地运行,并在向服务器发送多条记录后更新状态。请说明问题所在以及执行此任务的正确方法 这是代码服务类android应用程序通过RESTfulWebService向服务器发送重复记录,android,sql-server,sqlite,service,timer,Android,Sql Server,Sqlite,Service,Timer,我创建了一个应用程序,服务每5分钟运行一次,从sqlite获取记录并将其发送到服务器并更新sqlite中的状态,问题出现在sql server数据库中,其中一行被多次插入 我不知道是什么原因导致了这个问题,在调试我的代码时,我注意到当向服务器发送一行调试器时,调试器进入了计时器的内置类,并再次发送相同的记录,我感觉计时器正在一次又一次地运行,并在向服务器发送多条记录后更新状态。请说明问题所在以及执行此任务的正确方法 这是代码服务类 public class AlarmServices exten
public class AlarmServices extends Service {
private Timer myTimer;
private SQLiteDB dbHelper;
Cursor cursor;
String where = "1=1";
String Whatstatus;
String FFCode, TerrCode, FFMgr;
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
myTimer = new Timer();
myTimer.schedule(new TimerTask() {
@Override
public void run() {
scheduleAlarm();
getDataFromDB();
}
}, 0, 5 * 60 * 1000); // 5 min
Log.e("syn process start", "yes");
}
private void getDataFromDB() {
dbHelper = new SQLiteDB(AlarmServices.this);
dbHelper.open();
cursor = dbHelper.getInCompleteAttendance(where);
int rows = cursor.getCount();
if (rows > 0) {
cursor.moveToFirst();
for (int i = 0; i < rows; i++) {
int Id;
String recvdate, ffcode, terr_code, drcode, drname, addr, createddate, ffmgr, shift, lat, lon,droidrefno,locAddress, sync_status, curr_date, date_only;
Id = cursor.getInt(0);
recvdate = cursor.getString(1);
ffcode = cursor.getString(2);
terr_code = cursor.getString(3);
drcode = cursor.getString(4);
drname = cursor.getString(5);
addr = cursor.getString(6);
createddate = cursor.getString(7);
ffmgr = cursor.getString(8);
shift = cursor.getString(9);
lat = cursor.getString(10);
lon = cursor.getString(11);
droidrefno = cursor.getString(12);
locAddress = cursor.getString(13);
sync_status = cursor.getString(14);
curr_date = cursor.getString(15);
date_only = cursor.getString(16);
// Sync Server
ChkInsertDailyAttendanceOperation insertAttd = new ChkInsertDailyAttendanceOperation(AlarmServices.this,
recvdate, ffcode, terr_code, drcode, drname, locAddress,
createddate, ffmgr,shift,Double.parseDouble(lat),Double.parseDouble(lon),
droidrefno,curr_date,date_only);
insertAttd.execute();
cursor.moveToNext();
}
} else {
}
dbHelper.close();
}
public void scheduleAlarm() {
Long time = new GregorianCalendar().getTimeInMillis() + 1000;
Intent intentAlarm = new Intent(this, MyExtBroadcastReceiver.class);
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP, time, PendingIntent
.getBroadcast(this, 1, intentAlarm,PendingIntent.FLAG_UPDATE_CURRENT));
}
public static class MyExtBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "Sync Process Running",
Toast.LENGTH_LONG).show();
Log.e("sync process running","yes");
}
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
}
}
公共类AlarmServices扩展服务{
私人定时器;
私有SQLiteDB-dbHelper;
光标;
字符串,其中=“1=1”;
字符串Whatstatus;
字符串FFCode、TerrCode、FFMgr;
@凌驾
public void onCreate(){
//TODO自动生成的方法存根
super.onCreate();
myTimer=新计时器();
myTimer.schedule(新TimerTask(){
@凌驾
公开募捐{
调度报警();
getDataFromDB();
}
},0,5*60*1000);//5分钟
Log.e(“同步进程启动”,“是”);
}
私有void getDataFromDB(){
dbHelper=newsqlitedb(AlarmServices.this);
dbHelper.open();
cursor=dbHelper.getIncompleAttention(其中);
int rows=cursor.getCount();
如果(行数>0){
cursor.moveToFirst();
对于(int i=0;i
异步任务类的代码
public class ChkInsertDailyAttendanceOperation extends AsyncTask<String, Void, String> {
String serverResponse;
String Recv_Date, FF_code, Terr_code, Dr_code, Dr_name, Addr, Created_Date,Currdate,locAddr,
FF_mgr, Shift, Droid_Ref_No,DateOnly;
double Lat,Lng;
String Response ="{\"Value\":true,\"Successful\":true}"; //"{\"Successful\":true}";
Context cxt;
UserSQLiteDB dbHelper;
public ChkInsertDailyAttendanceOperation(Context context, String recv_Date,
String ff_code, String terr_code, String dr_code, String dr_name,
String locAddress, String created_Date,String ff_mgr, String shift,double lat,double lng,String droid_Ref_No,String currdate,String dateonly ) {
// TODO Auto-generated constructor stub
Recv_Date = recv_Date;
FF_code = ff_code;
Terr_code = terr_code;
Dr_code = dr_code;
Dr_name = dr_name;
//Addr = addr;
Created_Date = created_Date;
FF_mgr = ff_mgr;
Shift = shift;
Lat = lat;
Lng = lng;
Droid_Ref_No =droid_Ref_No;
locAddr = locAddress;
Currdate =currdate;
DateOnly =dateonly;
cxt=context;
}
@Override
protected String doInBackground(String... urls) {
RestAPI restAPI = new RestAPI();
JSONObject jsonObj = new JSONObject();
try {
jsonObj = restAPI.UserDailyAttendance(Recv_Date, FF_code,
Terr_code, Dr_code, Dr_name, locAddr, Created_Date, FF_mgr,
Shift,Lat, Lng,Droid_Ref_No);
serverResponse = jsonObj.toString();
} catch (Exception e) {
// TODO Auto-generated catch block
serverResponse="InternetNotFound";
Log.e("catch block", serverResponse);
}
Log.e("repsonse", serverResponse);
return serverResponse;
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
//pd.dismiss();
dbHelper = new SQLiteDB(cxt);
dbHelper.open();
String SyncStatus;
if (serverResponse.equals(Response)) {
SyncStatus = "C";
} else {
SyncStatus = "I";
}
dbHelper.updateDAILYATTENDANCE(Recv_Date, FF_code,
Terr_code, Dr_code, Dr_name, Addr, Created_Date, FF_mgr,
Shift,String.valueOf(Lat), String.valueOf(Lng),Droid_Ref_No,locAddr,SyncStatus,Currdate,DateOnly);
dbHelper.close();
}
@Override
protected void onPreExecute() {
super.onPreExecute();
//pd.show();
}
公共类ChkInsertDailyAttendanceOperation扩展了异步任务{
字符串服务器响应;
字符串记录日期、FF_代码、Terr_代码、Dr_代码、Dr_名称、地址、创建日期、Currdate、locAddr、,
值班副经理,机器人参考号,仅日期;
双Lat,液化天然气;
字符串响应=“{\'Value\':true,\'Successful\':true}”/“{\'Successful\':true}”;
上下文cxt;
UserSQLiteDB-dbHelper;
公共chkinsertdailAttendanceOperation(上下文,字符串recv_Date,
字符串ff_代码、字符串terr_代码、字符串dr_代码、字符串dr_名称、,
字符串地址、字符串创建日期、字符串ff管理、字符串移位、双lat、双lng、字符串droid\u参考号、字符串currdate、字符串dateonly){
//TODO自动生成的构造函数存根
接收日期=接收日期;
FF_代码=FF_代码;
地球代码=地球代码;
Dr_代码=Dr_代码;
Dr_name=Dr_name;
//Addr=Addr;
创建日期=创建日期;
FF_经理=FF_经理;
移位=移位;
Lat=Lat;
液化天然气=液化天然气;
Droid_Ref_No=Droid_Ref_No;
locAddr=locAddress;
Currdate=Currdate;
DateOnly=DateOnly;
cxt=上下文;
}
@凌驾
受保护的字符串doInBackground(字符串…URL){
RestAPI RestAPI=新RestAPI();
JSONObject jsonObj=新的JSONObject();
试一试{
jsonObj=restAPI.UserDailyAttendance(接收日期、FF代码、,
地球代码、博士代码、博士姓名、地址、创建日期、FF经理、,
班次、Lat、Lng、机器人参考号);
serverResponse=jsonObj.toString();
}捕获(例外e){
//TODO自动生成的捕捉块
serverResponse=“InternetNotFound”;
Log.e(“catch block”,serverResponse);
}
Log.e(“repsonse”,serverResponse);
返回服务器响应;
}
@凌驾
受保护的void onPostExecute(字符串结果){
super.onPostExecute(结果);
//pd.解散();
dbHelper=newsqlitedb(cxt);
dbHelper.open();
字符串同步状态;
if(serverResponse.equals(Response)){
SyncStatus=“C”;
}否则{
SyncStatus=“I”;
}
dbHelper.UpdateDailyatEndance(Recv_