2017-07-19 22 views
0

我正在創建一個從API中提取信息並將其顯示在Recyclerview中的Android應用程序。一切正常,但是,當應用程序打開時(使用Volley)我只有1 GET request使用Android和Recyclerview保持API數據新鮮

我想讓回收站視圖中的信息每5秒更新一次。我是Java新手,無法在網上找到任何其他問題或資源,解釋如何最有效地保持活動API的信息最新。我應該每5秒鐘更換一次Get Request,如果那樣的話你最好怎麼實現這個?如果沒有,是否有更合適的方法。

任何反饋都會幫助我,我相信會有一大堆未來的開發人員。我目前的代碼爲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); 
     } 
    } 
} 
+0

您可以使用'Handler'每5後致電網址秒 – Sony

回答

0

請嘗試此解決方案

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 
    }