2016-01-11 51 views
1

所以現在我刷卡刷新我的應用程序。當它被激活時,執行一個運行異步後臺任務的服務。問題是,刷新刷指示器立即消失。如何在服務運行完畢後保持顯示(並更新我的回收視圖)? 下面是一些代碼:保持SwipeRefreshLayout顯示,直到服務完成運行

 mSwipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.activity_main_swipe_refresh_layout); 
     mSwipeRefreshLayout.setColorSchemeResources(R.color.StatusbarColor,R.color.Accent); 

     mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { 
      @Override 
      public void onRefresh() { 
       db = new DatabaseHelper(getApplicationContext()); 
       callRefreshService(); 

      } 
     }); 

這裏是callRefreshService方法:

public void callRefreshService() { 
     try{ 
      Intent service = new Intent(getApplicationContext(), UpdateScoresService.class); 
      startService(service); 
     } 
     finally { 
      list.clear(); 
      list.addAll(db.getTracked()); 
      db.closeDB(); 
      adapter.notifyDataSetChanged(); 
      mSwipeRefreshLayout.setRefreshing(false); 
     } 
    } 

正如你可以看到我嘗試使用嘗試,最後卻沒有幫助。

+0

發送消息你需要做的是,在一個服務?我的意思是你爲什麼不使用'AsyncTask'並停止刷新'onPostExecute()'中的視圖? – SaNtoRiaN

+0

該服務還用於在應用程序未打開時刷新數據。我正在做你之前提到的,但我想合併代碼,不必管理兩組幾乎相同的代碼。 – user2923535

回答

1

startService(Intent)不會阻塞,它立即返回。

你有兩個選擇:

  1. 溝進行的AsyncTask
  2. 服務允許服務與活動

通信選擇1爲一些小事像一次性JSON下載任務。在onPostExecute (Result result)區塊撥打mSwipeRefreshLayout.setRefreshing(false)

如果您已經有複雜的設置,請選擇2。 活動與服務之間的溝通稍微複雜一些,您需要的是bind service。如果你想要一些簡單的東西,你可以看一下事件總線,它可以很好地分離事物。

這裏有一個事件總線的一些實現:

+0

該服務還用於在應用未打開時刷新數據。我正在做你之前提到的異步任務,但我想合併代碼,不必管理兩組幾乎相同的代碼。 – user2923535

+0

有沒有辦法讓我從我的服務中調用MainActivity中的方法? – user2923535

+0

給你的第一個評論:定義一個靜態方法,並在你的異步任務和服務中調用它呢? – tom91136

0

您的活動中創建一個BroadcastReceiver

BroadcastReceiver receiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     // stop refreshing the layout 
     mSwipeRefreshLayout.setRefreshing(false); 
    } 
}; 

其註冊到你的活動中onResume()聽一些Intenet和註銷這裏面onPause()

@Override 
protected void onResume() { 
    super.onResume(); 
    // register the receiver 
    registerReceiver(receiver, new IntentFilter("com.example.app.STOP_REFRESH")); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    // unregister the receiver 
    unregisterReceiver(receiver); 
} 

然後裏面你AsyncTaskonPostExecute()Intent

Intent intent = new Intent("com.example.app.STOP_REFRESH"); 
// you can also add extras to this intent 
// intent.putExtra("key", value); 
sendBroadcast(intent); 
相關問題