我发现如果我在创建活动时尝试从服务获取数据,它总是抛出空指针异常。那么如何延迟一段时间,显示加载动画,然后获取数据并刷新视图。
我有一个下载文件任务的服务,我希望在服务正常时显示片段中的下载进度。
我将片段附加到一个活动,该活动在其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();
答案 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