Сохранение данных API с помощью Android и Recyclerview

113
16

Я создаю приложение для Android, которое извлекает информацию из API и отображает его в Recyclerview. Однако все работает, у меня только 1 GET request когда приложение открывается (используя Volley).

Я бы хотел, чтобы информация обновлялась каждые 5 секунд. Я новичок в Java и не могу найти какие-либо другие вопросы или ресурсы в Интернете, которые объясняют, как наиболее эффективно поддерживать информацию из активного API в актуальном состоянии. Должен ли я Get Request каждые 5 секунд, если да, то как вам это лучше всего реализовать? Если нет, есть ли более правильный способ.

Любая обратная связь поможет мне, и я уверен, что будущие разработчики. Мой текущий код ниже для refrence.

MainActivity.java:

public class MainActivity extends AppCompatActivity {

private static final String URL_DATA = "https://summerproject17.herokuapp.com/api/request/";
private RecyclerView recyclerView;
private RecyclerView.Adapter adapter;

private List<ListItem> listItems;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));

listItems = new ArrayList<>();

loadRecyclerViewData();
}

private void loadRecyclerViewData(){
StringRequest stringRequest = new StringRequest(Request.Method.GET,
URL_DATA,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {
JSONObject jsonObject = new JSONObject(response);
JSONArray array = jsonObject.getJSONArray("results");

for(int i = 0; i < array.length(); i++){
JSONObject o = array.getJSONObject(i);
ListItem item = new ListItem(
o.getString("room"),
o.getString("request"),
o.getString("time")
);
listItems.add(item);
}

adapter = new MyAdapter(listItems, getApplicationContext());
recyclerView.setAdapter(adapter);

} catch (JSONException e) {
e.printStackTrace();
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("VOLLEY", error.getMessage());
}
});
RequestQueue requestQueue = Volley.newRequestQueue(this);
requestQueue.add(stringRequest);
}
}

MyAdapter.Java:

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {

private List<ListItem> listItems;
private Context context;

public MyAdapter(List<ListItem> listItems, Context context) {
this.listItems = listItems;
this.context = context;
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(context)
.inflate(R.layout.list_item, parent, false);
return new ViewHolder(v);

}

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
ListItem listItem = listItems.get(position);

holder.textViewHead.setText(listItem.getHead());
holder.textViewDesc.setText(listItem.getDesc());
}

@Override
public int getItemCount() {
return listItems.size();
}

public class ViewHolder extends RecyclerView.ViewHolder {

public TextView textViewHead;
public TextView textViewDesc;

public ViewHolder(View itemView) {
super(itemView);

textViewHead = (TextView) itemView.findViewById(R.id.textViewHead);
textViewDesc = (TextView) itemView.findViewById(R.id.textViewDesc);
}
}
}

спросил(а) 2021-01-19T19:51:28+03:00 9 месяцев, 1 неделя назад
1
Решение
103

Попробуйте это решение.

final Handler handler = new Handler();
Timer timer = new Timer();
TimerTask doAsynchronousTask = new TimerTask() {
@Override
public void run() {
handler.post(new Runnable() {
public void run() {
try {

// update data
} catch (Exception e) {
// TODO Auto-generated catch block
}
}
});
}
};
timer.schedule(doAsynchronousTask, 0, 5000); //execute in every 5000 ms or 5 secs
}

ответил(а) 2021-01-19T19:51:28+03:00 9 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема