2016-02-08 29 views
1
if (isConnected()) { 

     Event eInstance = new Event(); 
     theEvents = eInstance.downloadEvents(eventsNightlife, getActivity()); 
     rAdapter = new RecyclerAdapter(theEvents); 
     recyclerView.setAdapter(rAdapter); 
     progrsBar.setVisibility(View.GONE); 
     .... 

這是在「onCreateView」上運行的代碼的一部分。方法downloadEvents使用Volley下載JSON數據,提取它並返回項目列表(theEvents)。現在,當我的應用程序啓動時,回收站視圖爲空。如果我從我的主屏幕退出應用程序,然後再次運行我的應用程序,這次數據有時會被下載。JSON Download @ onCreateView leaves recyclerView empty

我調試一步一步,並在第一次啓動(我的意思是,當應用程序不只是恢復),theEvents是空的,所以下載沒有返回或理還什麼...

關於如何在向用戶顯示UI之前執行某些事情的建議,或者需要做些什麼才能更好地完成此任務?

還有,我用一個swipeRefreshLayout並在其onRefresh方法我做的:

public void onRefresh() { 
    Event eInstance = new Event(); 
    theEvents = eInstance.downloadEvents(eventsNightlife, getActivity()); 

    rAdapter.notifyDataSetChanged(); 

    swipeRefreshLayout.setRefreshing(false); 
} 

,但它不工作。我也試過

rAdapter = new RecyclerAdapter(theEvents); 
    rAdapter.notifyDataSetChanged(); 
    recyclerView.swapAdapter(rAdapter, false); 

仍然無法正常工作。

編輯:我downloadEvents方法實現亂射:

public List<Event> downloadEvents(String urlService, Context context) { 
    eventsList = new ArrayList<>(); 
    RequestQueue requestQueue = Volley.newRequestQueue(context); 
    JsonArrayRequest jsonArrayRequest = new JsonArrayRequest 
      (Request.Method.GET, urlService, null, new Response.Listener<JSONArray>() { 

       @Override 
       public void onResponse(JSONArray response) { 

        try { 
         String durationStr = null; 


         for (int i = 0; i < response.length(); i++) { 
          JSONObject eventJson = response.getJSONObject(i); 

          String title = eventJson.getString("EventTitle"); 
          String body = eventJson.getString("EventBody"); 
          String date = eventJson.getString("EventDate"); 
          String time = eventJson.getString("EventTime"); 
          int duration = Integer.parseInt(eventJson.getString("EventDuration")); 
          if (duration > 60) { 
           durationStr = "Duration: " + duration/60 + " h"; 
          } else if (duration < 60) { 
           durationStr = "Duration: " + duration + " m"; 
          } 
          String place = eventJson.getString("EventPlace"); 
          String organ = eventJson.getString("Organization"); 

          Event event = new Event(title, body, date, time, durationStr, place, organ); 
          eventsList.add(event); 

         } 

        } catch (JSONException e) { 
         e.printStackTrace(); 
        } 

       } 


      }, new Response.ErrorListener() { 

       @Override 
       public void onErrorResponse(VolleyError error) { 
        Log.e("VOLLEY ERROR", "" + error); 

       } 
      } 
      ); 
    requestQueue.add(jsonArrayRequest); 
    return eventsList; 
} 
+0

發佈您的downloadEvents方法體請 – Seyyed

回答

0

您可以使用EventBus你的目的是簡單和真理的方式。
在這裏,我寫一個如何使用EventBusvolley的例子。
考慮我想下載一些數據。

這是我的下載方法是裏面(你可以添加在將來更多的方法吧)類:
林用volley下載我的數據:

// Download methods is inside volley 
public class MyDownloader{ 

    public static void downloadData(){ 
     DownloadDataEvent dlDataEvent=new DownloadDataEvent(); 
     List<String> myResult=new ArrayList<>(); 

      ... 
      @Override 
      public void onResponse(JSONArray response) { 
       super.onResponse(response); 
       if(respone!=null){ 
        // Do what i want with my received data 
        dlDataEvent.setData(response); 
       } 
       // Post my event by EventBus 
       EventBus.getDefault().post(dlDataEvent); 
       ... 

     } 
    } 
} 

這是我的事件:

public class DownloadDataEvent{ 
    private JSONArray mData; 

    public void setData(JSONArray data){ 
     mData=data; 
    } 

    public JSONArray setData(){ 
     return mData; 
    } 

} 

現在我想用我的downloadData()方法我MainActivity內:
(我叫我downloadData方法INSI德onCreate

public class MainActivity extends Activity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     ... 

     // I have to register this class for EventBus subscriber: 
     if(!EventBus.getDefault().isRegister(this)){ 
       EventBus.getDefault().registerSticky(this); 
     } 

     // Call my downloadData method 
     if(isConnected()){ 
       MyDownloader.downloadData(); 
     } 
    } 

    // And for receive the data through EventBus, i have to create a 
    // method (subscriber) in this template: 
    public void onEventMainThread(DownloadDataEvent downloadDataEvent){ 
      JSONArray result=downloadDataEvent.getData(); 
      // Do what i want with my received data 
    } 
} 

要使用接收到的數據您可以在每次創建多個用戶。

  • 我把JSONArray傳遞給我的DownloadDataEvent,它不好。你可以反序列化你接收到的數據並將它傳遞給你的DownloadDataEvent。
  • 我使用Volley下載數據
  • 也許我的描述很混亂,但EventBus是一個知名的庫,非常容易使用。
+0

因此,我四處閱讀,並沒有在EventBus上找到太多東西。幾乎沒有教程,我不知道如何使用它。我在Android中並不擅長,所以我甚至感到困惑,你的例子的哪一部分純粹是一個例子,什麼是EventBus的一部分。因此,DownloadDataEvent更優雅地放在我製作Event對象的Event類中。我已經有那個。 Downloader是否是您認爲我使用Volley下載了我的數據的課程?你的意思是,我通常下載我的數據後,我把它作爲一個對象傳遞給EventBus.getDefault()。post(dlDataEvent); ??? – iBobb

+0

請問您可以擴展一下您的答案嗎? – iBobb

+0

你可以在網上找到很多關於EventBus的信息。 我的答案已更改。希望有所幫助。 但如果我的答案令人困惑,我很抱歉。 – Seyyed