繁体   English   中英

Android One JSON发送无用的时间发送到服务器

[英]Android One JSON send Mutilple time send to server

我开发了一个每1分钟将数据发送到服务器的应用程序。 它每分钟检查一次Internet连接,并且当有可用的Internet应用时,它将数据发送到服务器,并且在接收到成功标记后,它将删除发送数据的表行。 但是问题在于,它在到达成功标记之前发送一个JSON Mutliple时间来删除表行。
例如:如果我发送像{'amt':100}之类的json,则它由服务器接收,例如{'amt':100} {'amt':100} {'amt':100} {'amt':100}。 。多次,并且如果服务器执行像AMT特定标签的加法运算然后将其添加所有标签值节省5倍以上tag.so的实际值,如果AMT是100然后服务器500接收

AlarmReceiver.java

 public class AlarmReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Intent background = new Intent(context, BackgroundService.class);
        context.startService(background);
    }
}

BackgroundService.java

    public class BackgroundService extends Service {
    int debug = 0;
    private boolean isRunning;
    private Context context;
    private Thread backgroundThread;
    Helper hp = new Helper(BackgroundService.this);
    private ArrayList<NameValuePair> params;
    Connect cn = new Connect();
    DatabaseConnector dbConnector = new DatabaseConnector(BackgroundService.this);
    JSONObject finalObj;
    JSONArray resultSet;
    AQuery aq = new AQuery(this);

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {

        this.context = this;
        this.isRunning = false;
        this.backgroundThread = new Thread(myTask);
    }

    private Runnable myTask = new Runnable() {
        public void run() {
            // Do something here
            internet();
            stopSelf();
        }
    };

    @Override
    public void onDestroy() {
        this.isRunning = false;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        if (!this.isRunning) {
            this.isRunning = true;
            this.backgroundThread.start();
        }
        return START_STICKY;
    }

    private void internet() {
        finalObj = null;
        resultSet = null;
        if (hp.isonline() == true) {
            Log.e("dcn", "net connect");

            if (!dbConnector.isPayTableEmplty()) {
                //  Log.e("syncData", getPaymentJSON());
                hp.generateTxtOnSD(getPaymentJSON());
                Map<String, Object> params = new HashMap<>();
                params.put("bulk_pay_json", getPaymentJSON());
                String url = Urls.sync_url;
                aq.ajax(url, params, JSONObject.class, this, "jsonCallBack");
                Log.e("start", "start");

            } else {
                Log.e("syncData", "table is empty");
            }
        } else {
            Log.e("dcn", "net not connect");
        }
    }

    public void jsonCallBack(String url, JSONObject json, AjaxStatus status) {
        if (json != null) {
            if (debug == 1 || Urls.debug == true) {
                Log.e("result", json.toString());
                Log.e("url", url);
                Log.e("status", String.valueOf(status.toString()));
            }
            try {
                JSONObject jsonObject = new JSONObject(json.toString());
                if ("true".equals(jsonObject.getString("json_integrity"))) {
                    try {

                        String del_pay = dbConnector.deletePayMentTable();
                        hp.generateTxtOnSD(del_pay);
                        Log.d("result", "upload successfully");
                        showNotification();
                    } catch (Exception e) {
                    }
                } else {
                    Log.e("result", "error occured");
                }
            } catch (Exception e) {
                Log.d("Ex", e.getLocalizedMessage());
            }
        } else {
            new Helper(this).showToast(Urls.errors[1]);
        }


    }

    private String getPaymentJSON() {
        //get opid from SharedPrefrences
        ArrayList<String> opLn = hp.getOpId(BackgroundService.this);
        ArrayList<String> op = hp.getSaveOpInfo(BackgroundService.this);
        String opid;
        if (Integer.valueOf(opLn.get(0)) != 0) {
            opid = opLn.get(0);
        } else {
            opid = op.get(0);
        }

        // open DB for operation
        dbConnector.open();
        // get customer Table columns
        Cursor cursor = dbConnector.ListAllPayData();
        cursor.moveToFirst();
        while (cursor.isAfterLast() == false) {
            int totalColumn = cursor.getColumnCount();
            JSONObject rowObject = new JSONObject();
            for (int i = 0; i < totalColumn; i++) {
                if (cursor.getColumnName(i) != null) {
                    try {
                        rowObject.put("conNo", cursor.getString(cursor.getColumnIndex(dbConnector.CONNO)));
                        rowObject.put("amount", cursor.getString(cursor.getColumnIndex(dbConnector.PAIDAMT)));
                        rowObject.put("contact", cursor.getString(cursor.getColumnIndex(dbConnector.CONTACT)));
                        rowObject.put("lineman", cursor.getString(cursor.getColumnIndex(dbConnector.LNID)));
                        rowObject.put("time", cursor.getString(cursor.getColumnIndex(dbConnector.TIME)));
                        rowObject.put("discount", cursor.getString(cursor.getColumnIndex(dbConnector.DISCOUNT)));
                        rowObject.put("rcpt", "");
                        rowObject.put("remark", cursor.getString(cursor.getColumnIndex(dbConnector.REMARK)));
                    } catch (Exception e) {
                        Log.d("TAG_NAME", e.getMessage());
                    }
                }
            }
            resultSet = new JSONArray();
            resultSet.put(rowObject);
            cursor.moveToNext();
        }
        try {
            finalObj = new JSONObject();
            finalObj.put("error", "false");
            finalObj.put("opid", opid);
            finalObj.put("data", resultSet);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        dbConnector.close();
        return finalObj.toString();

    }

}

呼叫广播接收器

private void BrodcastReceiverOn() {
    this.context = this;
    Intent alarm = new Intent(this.context, AlarmReceiver.class);
    boolean alarmRunning = (PendingIntent.getBroadcast(this.context, 0, alarm, PendingIntent.FLAG_NO_CREATE) != null);
    if (alarmRunning == false) {
        pendingIntent = PendingIntent.getBroadcast(this.context, 0, alarm, 0);
        alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), 3000, pendingIntent);
    }
}

我使用AQuery进行发布和接收,因为不赞成使用HTTP客户端

我认为这是因为您的IntervalMillis用于:

alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), 3000, pendingIntent);

每3秒钟重复一次,单位为毫秒。

用这个

final long INTERVAL = 1 * 60 * 1000; // 1 minute
alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), INTERVAL, pendingIntent);

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM