Дооснащение не отменяет вызов даже при сбое - PullRequest
0 голосов
/ 13 апреля 2020

Так что я работаю с чем-то, чтобы вставить базу данных mysql, используя модификацию 2, но при плохом соединении данные не были вставлены в базу данных, но когда соединение установлено и стабилизировано, все данные не были отправлены в базу данных, было отправлено в базу данных, это сделает данные становятся двойными или более.

вот моя активность

OkHttpClient.Builder builder = new OkHttpClient.Builder();
        builder.interceptors().add(interceptor);
        OkHttpClient client = builder.build();

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(URL)
                .client(client)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        RegisterAPI api = retrofit.create(RegisterAPI.class);
        Call<Value> call = api.absensi(odometer, namaoutlet, ket, LocationLong, LocationLat, nilaiAbsen, kodeImei, img_new_name, fake_status);
        call.enqueue(new Callback<Value>() {
            @Override
            public void onResponse(Call<Value> call, Response<Value> response) {
                String value = response.body().getValue();
                String message = response.body().getMessage();
                progress.dismiss();
                if (value.equals("1")) {
                    if(message.equals("timeout")){
                        call.cancel();
                        client.dispatcher().cancelAll();
                    }else {
                        UploadImageToServer();


                        Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT).show();
                        Intent inLogin2 = new Intent(AbsensiActivity.this, MainActivity.class);
                        startActivity(inLogin2);
                        finish();
                    }
                } else {
                    Toast.makeText(AbsensiActivity.this, message, Toast.LENGTH_SHORT).show();
                }
            }

            @Override
            public void onFailure(Call<Value> call, Throwable t) {
                t.printStackTrace();
                progress.dismiss();
                call.cancel();
                client.dispatcher().cancelAll();
                if (call.isCanceled()) {
                    Log.e("TAG", "request was cancelled");
                }
                else {
                    Log.e("TAG", "other larger issue, i.e. no network connection?");
                }
                Toast.makeText(AbsensiActivity.this, "Data gagal di input, silahkan coba lagi", Toast.LENGTH_SHORT).show();
            }
        });

и это мой API

if($lng == "" || $lat == "" ){
        $response["value"] = 0;
        $response["message"] = "Masih mencari koordinat. Pastikan Koneksi dan GPS aktif.";
        echo json_encode($response);

    }elseif($rChecking > 0){
        $response["value"] = 0;
        $response["message"] = "Maaf,Anda sudah melakukan absensi.";
        echo json_encode($response);
    }elseif($rHide['loc_attedance']=="Y"){

        //Cari Posisi Absensi
        $dbPosisi   = new database;
        $dbPosisi->query("SELECT * FROM t_lock_attedance WHERE imeiNumber='$IMEINumber'");
        $jmlPosisi = 0;
        while($rPosisi  = $dbPosisi->tampilkan()){
            $jarak = round(distance($lat,$lng,$rPosisi['loc_lat'],$rPosisi['loc_lng'])*1000);
            if($jarak <= $radiusData){
                $jmlPosisi = $jmlPosisi+1;
            }
        }
        if($jmlPosisi > 0){
            $insert = new database;
            $str['loket_name']      = "$nama";
            $str['phoneNumber']     = "$IMEINumber";
            $str['getLatitude']     = "$lat";
            $str['getLongitude']    = "$lng";
            $str['alamat']          = "$alamatReal";
            //$str['tanggal']       = "$tglGab";
            $str['tanggal']         = "$timerserver";
            $str['gambar']          = "$fileName";
            $str['saran']           = "$keterangan";
            $str['km']              = "$odometer";
            $str['stat_penjualan']  = "N";
            $str['dcrypt']          = "N";
            $str['fake_status']     = "$fake_status";
            $insert->insert("t_report",$str);

            //Insert Absen
            $inAbsen = new database;
            $strA['phoneNumber']    = "$IMEINumber";
            $strA['alamat']         = "$alamatReal";
            //$strA['tanggal']      = "$tanggal";
            $strA['tanggal']        = "$timerserver";
            $strA['jam']            = "$jam";
            $strA['gambar']         = "$fileName";
            $strA['keterangan']     = "$keterangan";
            $strA['km']             = "$odometer";
            $strA['posisi']         = "$statusr";
            $strA['at_lat']         = "$lat";
            $strA['at_lng']         = "$lng";
            $strA['fake_status']        = "$fake_status";
            $inAbsen->insert("t_attedance",$strA);
            if($insert){
                $response["value"] = 1;
                $response["message"] = "Absensi Berhasil";
                echo json_encode($response);
            }else{
                $response["value"] = 0;
                $response["message"] = "Data Gagal di input";
                echo json_encode($response);
            }
        }else{
                $response["value"] = 0;
                $response["message"] = "Maaf, Anda di luar jangkauan Max. $radiusData";
                echo json_encode($response);
            }
    }else{
            $insert = new database;
            $str['loket_name']      = "$nama";
            $str['phoneNumber']     = "$IMEINumber";
            $str['getLatitude']     = "$lat";
            $str['getLongitude']    = "$lng";
            $str['alamat']          = "$alamatReal";
            //$str['tanggal']       = "$tglGab";
            $str['tanggal']         = "$timerserver";
            $str['gambar']          = "$fileName";
            $str['saran']           = "$keterangan";
            $str['km']              = "$odometer";
            $str['stat_penjualan']  = "N";
            $str['dcrypt']          = "N";
            $str['fake_status']     = "$fake_status";
            $insert->insert("t_report",$str);

            //Insert Absen
            $inAbsen = new database;
            $strA['phoneNumber']    = "$IMEINumber";
            $strA['alamat']         = "$alamatReal";
            //$strA['tanggal']      = "$tanggal";
            $strA['tanggal']        = "$timerserver";
            $strA['jam']            = "$jam";
            $strA['gambar']         = "$fileName";
            $strA['keterangan']     = "$keterangan";
            $strA['km']             = "$odometer";
            $strA['posisi']         = "$statusr";
            $strA['at_lat']         = "$lat";
            $strA['at_lng']         = "$lng";
            $strA['fake_status']    = "$fake_status";
            $inAbsen->insert("t_attedance",$strA);
            if($insert){
                $response["value"] = 1;
                $response["message"] = "Absensi Berhasil";
                echo json_encode($response);
            }else{
                $response["value"] = 0;
                $response["message"] = "Data Gagal di input";
                echo json_encode($response);
            }
    }

Я попытался отменить вызов в onFailure, но все же данные отправились в базу данных без Вызывается UploadImagetoServer () (метод onSuccess). Я чувствую, что я все еще вставляю базу данных, даже в модернизации, onFailure

Могу ли я что-нибудь сделать?

1 Ответ

1 голос
/ 14 апреля 2020

В Retrofit 2 call.cancel(); отменит запрос API, если он еще не запущен, или не запустит запрос. Вы не можете добавить call.cancel(); в методы onResponse и onFailure одного вызова. Вам не нужно отменять звонок. Вы должны просто проверить состояние ответа, если оно не равно «1», и сообщение, если истекло время ожидания, тогда вы должны повторить вызов API. В случае успеха go для UploadImageServer. Вы также можете проверить соединение inte rnet перед вызовом API. Вы можете обратиться к образцу на здесь .

Вы также можете добавить время ожидания на вашей стороне, чтобы предотвратить любую проблему времени ожидания для плохих соединений, как показано ниже.

OkHttpClient client = new OkHttpClient.Builder()
                    .connectTimeout(300, TimeUnit.SECONDS)
                    .readTimeout(300, TimeUnit.SECONDS)
                    .writeTimeout(300, TimeUnit.SECONDS)
                    .addInterceptor(interceptor).build();
...