android - 如何在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)
解决方案
我必须有一个解决方案,这肯定对你有用。
将上下文传递给构造函数参数
Context ctx;
public BerandaFragment(Context context) {
ctx = context;
}
并在您的 toast 消息或任何需要上下文的内容中使用它
Toast.makeText(ctx, "Berhasil memperbarui data", Toast.LENGTH_SHORT).show();
推荐阅读
- r - 在 Shiny 中手动展开 menuSubItem
- json - 无法使用 Json.Net 反序列化 JSON 数组
- typescript - Vue $refs 对象的类型为“未知”
- azure-active-directory - Azure Active Directory - UI > API - 401 Error
- scala - Type constraint on input function parameter in Scala
- python - how to prevent data from being repeated in the template even though the context is being nested
- firebase - 使用 Firebase 托管删除 Etag 和 Last-Modified 标头
- python - 如何让这个导航栏品牌以导航栏为中心?
- pandas - 附加不同长度的新 DataFrame 列
- google-cloud-platform - Google HTTP/S Load Balancing Health Criteria