首页 > 解决方案 > 如何在android上的选定片段中重复请求数据库?

问题描述

我试图向数据库发出重复请求,以便片段中的文本视图从数据库中获取值的更新。但是,当我移动到另一个片段时,应用程序会强制关闭。有没有办法重复请求,但只有在选择片段时才可以?

public class BerandaFragment extends Fragment {
    String user_id, series;
    TextView co, co2, pm25, suhu, kelembaban, tekanan, statusco, statusco2, statuspm25;
    int co_int, co2_int, pm25_int;
    int count = 0;

    public BerandaFragment() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View v = inflater.inflate(R.layout.fragment_beranda, container, false);


        //ToolbarName
        Toolbar toolbar = (Toolbar) getActivity().findViewById(R.id.toolbar);
        toolbar.setTitle("Beranda");

        //session user_id
        SessionManager sessionManager = new SessionManager(getActivity());
        user_id = sessionManager.getUserDetail().get("user_id");

        //session series
        SessionManagerSeries sessionManagerSeries = new SessionManagerSeries(getActivity());
        series = sessionManagerSeries.getPilihSeries().get("series");

        //Bind view layout
        co = (TextView) v.findViewById(R.id.nilaiCO);
        co2 = (TextView) v.findViewById(R.id.nilaiCO2);
        pm25 = (TextView) v.findViewById(R.id.nilaiPM25);
        suhu = (TextView) v.findViewById(R.id.nilaiSuhu);
        kelembaban = (TextView) v.findViewById(R.id.nilaiKelembaban);
        tekanan = (TextView) v.findViewById(R.id.nilaiTekanan);
        statusco = (TextView) v.findViewById(R.id.statusCO);
        statusco2 = (TextView) v.findViewById(R.id.statusCO2);
        statuspm25 = (TextView) v.findViewById(R.id.statusPM25);

        refreshdata();

        return v;
    }

    private void refreshdata() {
        count++;

        Call<DataSensor> dataSensorCall = ApiClient.getInstance().apiInterface().dataSensorResponse(user_id, series);
        dataSensorCall.enqueue(new Callback<DataSensor>() {
            @Override
            public void onResponse(Call<DataSensor> call, Response<DataSensor> response) {

                if (response.body() != null && response.isSuccessful() && response.body().isStatus()){
                    DataSensorData dataSensorData = response.body().getDataSensorData();

                    co_int = Integer.parseInt(dataSensorData.getCo());
                    co2_int = Integer.parseInt(dataSensorData.getCo2());
                    pm25_int = Integer.parseInt(dataSensorData.getPm25());

                    co.setText(dataSensorData.getCo());
                    co2.setText(dataSensorData.getCo2());
                    pm25.setText(dataSensorData.getPm25());
                    suhu.setText(dataSensorData.getSuhu());
                    kelembaban.setText(dataSensorData.getKelembaban());
                    tekanan.setText(dataSensorData.getTekanan());

                    //Status CO
                    if (co_int <= 50){
                        statusco.setText("Baik");
                    } else if (co_int > 50 && co_int <= 100){
                        statusco.setText("Sedang");
                    } else if (co_int > 100 && co_int <= 199){
                        statusco.setText("Tidak sehat");
                    } else if (co_int >= 200 && co_int <= 299){
                        statusco.setText("Sangat tidak sehat");
                    } else {
                        statusco.setText("Berbahaya");
                    }

                    //Status CO2
                    if (co2_int <= 50){
                        statusco2.setText("Baik");
                    } else if (co2_int > 50 && co2_int <= 100){
                        statusco2.setText("Sedang");
                    } else if (co2_int > 100 && co2_int <= 199){
                        statusco2.setText("Tidak sehat");
                    } else if (co2_int >= 200 && co2_int <= 299){
                        statusco2.setText("Sangat tidak sehat");
                    } else {
                        statusco2.setText("Berbahaya");
                    }

                    //Status PM25
                    if (pm25_int <= 50){
                        statuspm25.setText("Baik");
                    } else if (pm25_int > 50 && pm25_int <= 100){
                        statuspm25.setText("Sedang");
                    } else if (pm25_int > 100 && pm25_int <= 199){
                        statuspm25.setText("Tidak sehat");
                    } else if (pm25_int >= 200 && pm25_int <= 299){
                        statuspm25.setText("Sangat tidak sehat");
                    } else {
                        statuspm25.setText("Berbahaya");
                    }

                    Toast.makeText(getContext(), "Berhasil memperbarui data", Toast.LENGTH_SHORT).show();

                } else {
                    Toast.makeText(getContext(), "Gagal memperbarui data", Toast.LENGTH_SHORT).show();
                }
            }

            @Override
            public void onFailure(Call<DataSensor> call, Throwable t) {
                Toast.makeText(getContext(), t.getMessage(), Toast.LENGTH_SHORT).show();
            }
        });

        refresh(3000);
    }

    private void refresh(int miliseconds) {
        final Handler handler = new Handler();
        final Runnable runnable = new Runnable() {
            @Override
            public void run() {
                refreshdata();
            }
        };
        handler.postDelayed(runnable, miliseconds);
    }
}

这是错误消息:

2021-04-17 10:13:49.369 1851-1851/com.example.partyapps E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.partyapps, PID: 1851
    java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference
        at android.widget.Toast.<init>(Toast.java:126)
        at android.widget.Toast.makeText(Toast.java:289)
        at android.widget.Toast.makeText(Toast.java:279)
        at com.example.partyapps.Fragment.BerandaFragment$1.onResponse(BerandaFragment.java:138)
        at retrofit2.DefaultCallAdapterFactory$ExecutorCallbackCall$1.lambda$onResponse$0$DefaultCallAdapterFactory$ExecutorCallbackCall$1(DefaultCallAdapterFactory.java:89)
        at retrofit2.-$$Lambda$DefaultCallAdapterFactory$ExecutorCallbackCall$1$3wC8FyV4pyjrzrYL5U0mlYiviZw.run(Unknown Source:6)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6698)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:495)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:859)

标签: androidandroid-fragments

解决方案


我必须有一个解决方案,这肯定对你有用。

将上下文传递给构造函数参数

 Context ctx;

public BerandaFragment(Context context) {
        ctx = context;
    }

并在您的 toast 消息或任何需要上下文的内容中使用它

Toast.makeText(ctx, "Berhasil memperbarui data", Toast.LENGTH_SHORT).show();

推荐阅读