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

delay to get data from service to avoid null pointer

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

我有一个下载文件任务的服务,我想在服务工作时以片段的形式显示下载进度。

我将片段附加到 activity,它在其 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");

但是每次转到片段时,我都会遇到空指针异常,它说服务为空。但是我已经将服务绑定到 activity,为什么会发生这种情况。

见fragment中的方法

@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);
}

估计是恢复fragment的时候服务还没有绑定导致的,所以想在等待服务绑定的时候放一个loading动画,之后可以在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();

我不太确定,但试一试。

我们需要等到服务不为空,所以

代码应该是

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

但要注意如果不是这样(等待没解决)app会死循环 你必须强制关闭它,你可以在日志中看到睡眠发生了多少次,所以你会知道 txService 何时不再为空。

P.S:如果您有特定的日志标签,只需在 Log.i()

处使用它代替 "TAG"

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

这是一个异步过程,因此您应该创建一个 ServiceConnection 侦听器并根据 onServiceConnected() 执行操作。同时你应该展示你的等待动画,只有在绑定成功时才关闭它。

带有详细代码片段的教程在这里:http://developer.android.com/guide/components/bound-services.html