延迟从服务中获取数据以避免空指针

时间:2015-01-05 06:52:34

标签: android android-fragments service

我发现如果我在创建活动时尝试从服务获取数据,它总是抛出空指针异常。那么如何延迟一段时间,显示加载动画,然后获取数据并刷新视图。

我有一个下载文件任务的服务,我希望在服务正常时显示片段中的下载进度。

我将片段附加到一个活动,该活动在其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);
}

我想这是因为当我恢复片段时服务没有绑定,所以我想在等待服务绑定时显示加载动画,之后,我可以将下载进度设置为listview。

我不知道如何实现这一点,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)

并且TansferActivity中的空指针线244是

txService.getAllDownloadTaskInfos();

2 个答案:

答案 0 :(得分: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何时不再为null。

P.S:如果你有一个特定的日志标记,只需在"TAG"使用它而不是Log.i()

答案 1 :(得分:1)

我建议您查看有关绑定服务的Android教程。

这是一个异步过程,因此您应该创建一个ServiceConnection侦听器并对onServiceConnected()采取行动。同时你应该展示你的等待动画,只有在绑定成功时才解除它。

带有详细代码段的教程位于:http://developer.android.com/guide/components/bound-services.html