2015-01-05 36 views
0

我發現如果我嘗試從創建活動時的分鐘服務中獲取數據,它總是會拋出空指針異常。那麼如何延遲一段時間,顯示加載動畫,然後獲取數據並刷新視圖。延遲從服務獲取數據以避免空指針

我有一個用於下載文件任務的服務,並且我希望在服務工作時顯示片段中的下載進度。

我將該片段附加到一個活動,該活動在其onCreate生命週期方法上綁定該服務。

// bind transfer service 
    Intent bIntent = new Intent(this, TransferService.class); 
    startService(bIntent); 
    bindService(bIntent, mConnection, Context.BIND_AUTO_CREATE); 
    Log.d(DEBUG_TAG, "try bind TransferService"); 

但每次我得到的片段,我得到空指針異常,它說服務是空的。但是我已經將服務綁定到活動上,爲什麼會發生這種情況。

請參閱片段中的方法。

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    Log.d(DEBUG_TAG, "onActivityCreated"); 
    super.onActivityCreated(savedInstanceState); 

    List<DownloadTaskInfo> infos = mActivity.getTransferService().getAllDownloadTaskInfos(); 
    adapter = mActivity.getDownloadTasksAdapter(infos); 
    transferTasksList.setAdapter(adapter); 
} 

我想這造成不綁定然而,當我恢復片段的服務,所以我想顯示加載動畫等待服務以獲取綁定,在這之後,我可以設置下載進度的時候列表顯示。

我不知道如何實現這個,asynctask可以做到這一點嗎?在等待綁定時顯示加載動畫,並在綁定時顯示設置數據源。

在此先感謝。

編輯
錯誤日誌

java.lang.NullPointerException 
     at com.seafile.seadroid2.ui.activity.TransferActivity.getDownloadTaskInfos(TransferActivity.java:244) 
     at com.seafile.seadroid2.ui.activity.TransferActivity.getDownloadTasksAdapter(TransferActivity.java:212) 
     at com.seafile.seadroid2.ui.fragment.DownloadTasksFragment.onActivityCreated(DownloadTasksFragment.java:30) 
     at android.support.v4.app.Fragment.performActivityCreated(Fragment.java:1478) 
     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:945) 
     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1102) 
     at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682) 
     at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1458) 
     at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:470) 
     at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141) 

和空指針線244 TansferActivity是

txService.getAllDownloadTaskInfos(); 
+0

我不知道,Android支持一些這方面的具體溶膠,但如果我是你,我會回調添加到'getAllDownloadTaskInfos()'和我將從服務中調用該回調,當下載完成時,活動知道這一點,隱藏進度條並開始處理數據... – Yazan

+0

也許我沒有清楚地表達意思,getAllDownloadTaskInfos()方法返回所有下載任務的狀態可以是初始化,傳輸和完成。因此,我的意思是在文件傳輸過程中從服務中獲取列表,因爲在此時更新ui纔有意義。 –

+0

所以你甚至在調用'getAllDownloadTaskInfos()'之前需要一些延遲?這可能不是原因,你可能在綁定或其他問題上有問題,但是你可以在綁定之後和調用方法之前在'try/catch'內使用'Thread.slpeep(3000)',我懷疑這是case,但如果它的工作,我會張貼一個更好的解決方案的睡眠時間,並張貼崩潰logcat也是好主意 – Yazan

回答

1

我建議您查看有關綁定到服務的Android教程。

這是一個異步過程,因此您應該創建一個ServiceConnection偵聽器並根據onServiceConnected()採取行動。在此期間,您應該呈現您的等待動畫,並且只有在綁定成功時才解除它。

有詳細的代碼片段教程是在這裏:http://developer.android.com/guide/components/bound-services.html

+0

但是當我根據文章修改代碼時,我得到了'android.app.ServiceConnectionLeaked',錯誤是android.app.ServiceConnectionLeaked:Activity com.seafile.seadroid2.ui.activity.TransferActivity泄漏了ServiceConnection com.seafile.seadroid2 .ui.fragment.DownloadTasksFragment $ 1 @ 41d56050最初在這裏綁定 –

+0

我有一個名爲'TransferActivity'的Activity和兩個片段'DownloadTasksFragment'和'UploadTasksFragment'。在綁定活動中的服務之前,現在爲了顯示加載動畫,我更改了綁定活動和兩個片段中的服務。任何想法? –

+0

您應該在Activity中綁定一次服務,然後通過自定義偵聽器通知碎片。 – Vaiden

1

我不知道這一點,但不妨一試。

我們需要等待,直到服務不爲空,所以

的代碼應該是

while(txService == null){ 
    try{ 
     Thread.sleep(200); 
     Log.i("TAG","sleep for binding ...") 
    }catch(Execeptio e){ 
     e.printStacktrace() 
    } 
}//while loop 
txService.getAllDownloadTaskInfos(); 

,但要小心,如果不是這種情況(等待並沒有解決)的應用將是在無限循環 中,您必須強制關閉它,您可以在Logs中看到睡眠發生的次數,因此您將知道txService何時不再爲空。

P.S:如果你有日誌特定標籤,只是用它來代替"TAG"Log.i()