使用Sync Adater(1)综述

在一个安卓设备和网络服务器之间同步数据可以让我们的应用显著的更有用和激发兴趣对用户来说。举例,传送数据到网络服务器是一个有用的备份,并且从服务器传送数据即使在设备离线的情况下用户也可以使用。在某些情况下,用户可能发现在网络接口输入和编辑他们的数据更简单然后让这些数据在他们设备上可用,或者他们想收集过时的数据然后上传到中心保持区域。
虽然我们可以设计自己的系统用来实现数据传输,但是我们应该考虑使用安卓的sync adapter 框架。这个框架帮助管理和自动数据传输,并且协调跨应用的同步操作。在我们使用这个框架,可以使用我们自己设计的的数据传输方案没有的几个特点:
Plug-in architecture
允许我们添加数据传输的代码到系统以可调用组件的形式
Automated execution
允许我们基于一些标准的自动数据传输,包括数据改变、逝去时间或者一天中的时间(including data changes, elapsed time, or time of day)。此外,系统添加不能执行的传输到一个队列中,在可能时运行他们
Automated network checking
系统仅仅会执行数据传输当设备有网络连接(不用自己判断有没有网了)
Improved battery performance
允许我们集中应用的所有数据传输任务发生在一个地方,这样他们全部同时运行。我们的应用传输也和其他应用的数据传输一起协同调度。这些因素减少了系统开启网络的次数,减少电量使用
Account management and authentication
如果我们的应用要求用户授权或者服务登录,我们可以选择性的集成账户管理和权限认证到我们的数据传输中。
注意:这就是Sync adapter和其他的区别咯
Sync adapters异步执行,所以我们应用使用它们期望它们传输数据有规律和高效,而不是及时的。如果需要及时数据传输,应该在AsyncTask和IntentService中
对于AsyncTask实现,首先需要定义一个类实现这个AsyncTask,有四个方法,主要是DoInBackground和onPostExecute,前者执行这个查询,后者处理查询的结果,在sunshine中,一开始还需要这个结果,是插入数据库之后又查出来,然后根据查询结果更新,后来使用了CursorLoader之后,就不需要这个结果,只需要插入数据库,查询就由loader来完成了。
Cursorloader的调用,需要调用者实现一个回调机制,实现LoaderManager.LoaderCallbacks<Cursor>接口,三个方法,来更新这个Cursor中的数据。同理,这个Cursor需要绑定view,在cursor的定义中有,sunshine定义的这个cursor是继承CursorAdapter的,这个以后再梳理一下。
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    String locationSetting = Utility.getPreferredLocation(getActivity());
    String order = WeatherContract.WeatherEntry.COLUMN_DATE + " ASC";
    Uri weatherForLocationUri = WeatherContract.WeatherEntry.buildWeatherLocation(locationSetting);
    return  new CursorLoader(getActivity(), weatherForLocationUri,
            FORECAST_COLUMNS, null, null, order);
}


@Override
public void onLoadFinished(android.support.v4.content.Loader<Cursor> loader, Cursor data) {
    mForecastAdapter.swapCursor(data);
    if (mPosition != ListView.INVALID_POSITION) {
        // If we don't need to restart the loader, and there's a desired position to restore
        // to, do so now.
        mListView.smoothScrollToPosition(mPosition);
    }
}


@Override
public void onLoaderReset(Loader<Cursor> loader) {
    mForecastAdapter.swapCursor(null);
}


使用IntentService,就是使用实现了一个IntentService的类,不直接实现service还是因为IntentService有很好的封装了吧,然后sunshine的例子是不直接启动这个service,而是使用一个监听器,先启动监听器,监听器在启动service?
Intent alarmIntent = new Intent(getActivity(), SunShineService.AlarmReceiver.class);
alarmIntent.putExtra(SunShineService.LOCATION_QUERY_EXTRA, location);
PendingIntent pi = PendingIntent.getBroadcast(getActivity(), 0, alarmIntent, PendingIntent.FLAG_ONE_SHOT);
AlarmManager  am = (AlarmManager)getActivity().getSystemService(Context.ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 5000, pi);


监听器中启动service:
static public class AlarmReceiver extends BroadcastReceiver{


    @Override
    public void onReceive(Context context, Intent intent) {
        Intent sendInentd = new Intent(context, SunShineService.class);
        String location = intent.getStringExtra(SunShineService.LOCATION_QUERY_EXTRA);
        sendInentd.putExtra(SunShineService.LOCATION_QUERY_EXTRA, location);
        context.startService(sendInentd);
    }
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值