延迟从服务获取数据以避免空指针
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
我发现如果我在创建 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