Как обновить значения в общих настройках? - PullRequest
0 голосов
/ 08 июня 2018

Я занимаюсь разработкой динамического приложения для Android с использованием библиотеки Retrofit.Приложение отправляет запросы на серверные php файлы и получает от них json ответ.Я следую этому учебному пособию для системы регистрации входа.Значения, которые извлекаются из базы данных mysql, сначала сохраняются в SharedPreferences, а затем устанавливаются на соответствующие TextView.

Все работает нормально.Но когда я изменяю значения в базе данных, пользователю необходимо выйти и снова войти в систему, чтобы увидеть обновленные значения.Я попытался создать функцию в моем ProfileFragment.java

private void refreshProcess(String email1){
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(Constants.BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .build();

    RequestInterface requestInterface = retrofit.create(RequestInterface.class);

    User user = new User();
    user.setEmail(email1);
    ServerRequest request = new ServerRequest();
    request.setOperation(Constants.REFRESH_OPERATION);
    request.setUser(user);
    Call<ServerResponse> response = requestInterface.operation(request);
    response.enqueue(new Callback<ServerResponse>() {
        @Override
        public void onResponse(Call<ServerResponse> call, retrofit2.Response<ServerResponse> response) {

            ServerResponse resp = response.body();
            Snackbar.make(getView(), resp.getMessage(), Snackbar.LENGTH_LONG).show();

            if(resp.getResult().equals(Constants.SUCCESS)){
                SharedPreferences.Editor editor = pref.edit();
                editor.putBoolean(Constants.IS_LOGGED_IN,true);
                editor.putString(Constants.EMAIL,resp.getUser().getEmail());
                editor.putString(Constants.NAME,resp.getUser().getName());
                editor.putString(Constants.ROLLNO,resp.getUser().getRollno());
                editor.putString(Constants.TOTL_FEES,resp.getUser().getTotl_fees());
                editor.putString(Constants.PAID_FEES,resp.getUser().getPaid_fees());
                editor.putString(Constants.REM_FEES,resp.getUser().getRem_fees());
                editor.putString(Constants.MON_ATT,resp.getUser().getMon_att());
                editor.putString(Constants.TUE_ATT,resp.getUser().getTue_att());
                editor.putString(Constants.WED_ATT,resp.getUser().getWed_att());
                editor.putString(Constants.THRS_ATT,resp.getUser().getThrs_att());
                editor.putString(Constants.FRI_ATT,resp.getUser().getFri_att());
                editor.putString(Constants.SAT_ATT,resp.getUser().getSat_att());
                editor.putString(Constants.SUN_ATT,resp.getUser().getSun_att());
                editor.putString(Constants.TST1_DATE,resp.getUser().getTst1_date());
                editor.putString(Constants.TST1_DATE,resp.getUser().getTst1_date());
                editor.putString(Constants.TST1_MARKS,resp.getUser().getTst1_marks());
                editor.putString(Constants.TST1_RANK,resp.getUser().getTst1_rank());
                editor.putString(Constants.TST2_DATE,resp.getUser().getTst2_date());
                editor.putString(Constants.TST2_MARKS,resp.getUser().getTst2_marks());
                editor.putString(Constants.TST2_RANK,resp.getUser().getTst2_rank());
                editor.putString(Constants.TST3_DATE,resp.getUser().getTst3_date());
                editor.putString(Constants.TST3_MARKS,resp.getUser().getTst3_marks());
                editor.putString(Constants.TST3_RANK,resp.getUser().getTst3_rank());
                editor.putString(Constants.TST4_DATE,resp.getUser().getTst4_date());
                editor.putString(Constants.TST4_MARKS,resp.getUser().getTst4_marks());
                editor.putString(Constants.TST4_RANK,resp.getUser().getTst4_rank());
                editor.putString(Constants.TST5_DATE,resp.getUser().getTst5_date());
                editor.putString(Constants.TST5_MARKS,resp.getUser().getTst5_marks());
                editor.putString(Constants.TST5_RANK,resp.getUser().getTst5_rank());
                editor.putString(Constants.UNIQUE_ID,resp.getUser().getUnique_id());
                editor.putString(Constants.PERSONAL_MSG,resp.getUser().getPersonalMsg());
                editor.putString(Constants.BROADCAST_MSG,resp.getUser().getBroadcast_msg());
                editor.apply();
                goToProfile();

            }
            progress.setVisibility(View.INVISIBLE);
        }


        private void goToProfile(){

            Fragment profile = new ProfileFragment();
            FragmentTransaction ft = getFragmentManager().beginTransaction();
            ft.replace(R.id.fragment_frame,profile);
            ft.commit();
        }

        @Override
        public void onFailure(Call<ServerResponse> call, Throwable t) {

            progress.setVisibility(View.INVISIBLE);
            Log.d(Constants.TAG,"failed");
            Snackbar.make(getView(), t.getLocalizedMessage(), Snackbar.LENGTH_LONG).show();

        }
    });
}

Функция отправляет строку электронной почты, которая инициализируется как текущий вошедший в систему пользователь.Он хранится в виде строки в классе Constants.java с установленным значением, которое хранится в SharedPreferences во время входа пользователя в систему.

String email1=pref.getString(Constants.EMAIL,"");
            refreshProcess(email1);

на стороне сервера, у меня есть файл index.phpкоторая проверяет операцию refresh

if ($operation == 'refresh') {

          $user = $data -> user;
          $email = $user -> email;

          echo $fun -> refreshUserData($email);

    }

Файл functions.php имеет функцию refreshUserData

public function refreshUserData($email){
$db = $this -> db;

$result =  $db -> refreshData($email);

if(!$result) {

    $response["result"] = "failure";
    $response["message"] = "Failed to Refresh";
    return json_encode($response);

   } else {

    $response["result"] = "success";
    $response["message"] = "Refresh Complete";
    $response["user"] = $result;
    return json_encode($response);

   }
}

Вот функция refreshData в файле DBOperations.php

public function refreshData($email){

$sql = 'SELECT * FROM users WHERE email = :email';
      $query = $this -> conn -> prepare($sql);
      $query -> execute(array(':email' => $email));
      $data = $query -> fetchObject();

    $user["name"] = $data -> name;
    $user["attendance"] = $data -> attendance;
    $user["email"] = $data -> email;
    $user["unique_id"] = $data -> unique_id;
    $user["rollno"] = $data -> rollno;
    $user["totl_fees"] = $data -> totl_fees;
    $user["paid_fees"] = $data -> paid_fees;
    $user["rem_fees"] = $data -> rem_fees;
    $user["mon_att"] = $data -> mon_att;
    $user["tue_att"] = $data -> tue_att;
    $user["wed_att"] = $data -> wed_att;
    $user["thrs_att"] = $data -> thrs_att;
    $user["fri_att"] = $data -> fri_att;
    $user["sat_att"] = $data -> sat_att;
    $user["sun_att"] = $data -> sun_att;
    $user["tst1_date"] = $data -> tst1_date;
    $user["tst1_marks"] = $data -> tst1_marks;
    $user["tst1_rank"] = $data -> tst1_rank;
    $user["tst2_date"] = $data -> tst2_date;
    $user["tst2_marks"] = $data -> tst2_marks;
    $user["tst2_rank"] = $data -> tst2_rank;
    $user["tst3_date"] = $data -> tst3_date;
    $user["tst3_marks"] = $data -> tst3_marks;
    $user["tst3_rank"] = $data -> tst3_rank;
    $user["tst4_date"] = $data -> tst4_date;
    $user["tst4_marks"] = $data -> tst4_marks;
    $user["tst4_rank"] = $data -> tst4_rank;
    $user["tst5_date"] = $data -> tst5_date;
    $user["tst5_marks"] = $data -> tst5_marks;
    $user["tst5_rank"] = $data -> tst5_rank;
    $user["personal_msg"] = $data -> personal_msg;
    $user["broadcast_msg"] = $data -> broadcast_msg;

    return $user;
}

После выполнения всей этой саги, когда я нажимаю кнопку Обновить, которая вызывает функцию refreshProcess(), приложение останавливается.Вот logcat

06-08 18:09:50.101 2544-2544/net.softglobe.learn2crack E/AndroidRuntime: FATAL EXCEPTION: main
Process: net.softglobe.learn2crack, PID: 2544
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.View.setVisibility(int)' on a null object reference
    at net.softglobe.learn2crack.ProfileFragment$5.onResponse(ProfileFragment.java:293)
    at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$1.run(ExecutorCallAdapterFactory.java:68)
    at android.os.Handler.handleCallback(Handler.java:751)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:6119)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

Пожалуйста, помогите мне, предоставив удовлетворительное решение, так как я потратил много времени на это и искал повсюду, как этого добиться, но не получил ответа.

...