热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何注入SyncAdapter

如何解决《如何注入SyncAdapter》经验,为你挑选了1个好方法。

我刚刚开始学习如何使用Dagger,并且已经将我的Backend连接类转换为自动注入.

该类处理Retrofit并执行网络请求.它曾经有静态方法,但现在它是一个对象,例如:

Backend.fetchPost(context, 42); // old way
mBackend.fetchPost(42); // mBackend is an injected field

上下文用于检索AccountManager使用我的后端服务器提供OAuth令牌的上下文.现在自动注入.

这在活动和片段中效果很好,但我无法弄清楚如何注入我的SyncAdapter课程.
实际上,它是一个我无法控制的框架对象,并且AndroidInjections没有准备好注入这种类的静态方法.

这是我想要工作的代码:

/**
 * Handle the transfer of data between the backend and the app, using the Android sync adapter framework.
 */
public class SyncAdapter extends AbstractThreadedSyncAdapter {    
    @Inject
    public Backend mBackend; // can't use constructor injection,
                             // so might aswell use a public field

    public SyncAdapter(Context context, boolean autoInitialize) {
        super(context, autoInitialize);
    }

    public SyncAdapter(Context context, boolean autoInitialize, boolean allowParallelSyncs) {
        super(context, autoInitialize, allowParallelSyncs);
    }

    @Override
    public void onPerformSync(Account account, Bundle extras, String authority, ContentProviderClient provider, SyncResult syncResult) {
        List posts = mBackend.getPosts();
        // do stuf with the posts
    }
}

所以我知道我应该@#!.inject(this)在构造函数中调用某个地方,但我不确切地知道我应该怎么做:

在应用程序类上使用静态字段来检索依赖关系图的头部,并让它浏览它直到它可以注入所有字段

创建一个工厂类和接口,如用于活动和片段的接口

别的什么?

关于我的dagger2实现的更多细节:

Backend类有一个@Inject构造函数,所以匕首应该能够构建它,只要它可以得到API和GSON解析器的实例:

@Inject
public Backend(BackendApi api, @UploadGson Gson uploadGson) {
    mApi = api;
    mUploadGson = uploadGson;
}

BackendModule匕首模块具有@Provide用于方法@UploadGson Gson的对象,并从依赖关系列表BackendApi来应用程序类(改型)(通过各种对象,如注射器或记录器)

BackendModule.class被引用的modules = {}应用程序的声明@Component

所以基本上,给定一个应用程序对象,dagger应该能够实例化一个类的对象Backend,我想将它注入到我的SyncAdapter类中.
我只是不知道如何实际触发注射.

PS:如上所述,我昨天学会了Dagger,所以请告知你是否认为我的实施已被破坏.



1> Benoit Duffe..:

我想我在这里发帖太快了.我认为框架实例化了我SyncAdapter,但我自己也是这样做的:

public class SyncService extends Service {
    private static final Object sSyncAdapterLock = new Object();

    private static SyncAdapter sSyncAdapter = null;

    /**
     * Instantiate the sync adapter object.
     */
    @Override
    public void onCreate() {
        synchronized (sSyncAdapterLock) {
            if (sSyncAdapter == null) {
                sSyncAdapter = new SyncAdapter(getApplicationContext(), true); // bingo!
            }
        }
    }

    /**
     * Return an object that allows the system to invoke the sync adapter.
     */
    @Override
    public IBinder onBind(Intent intent) {
        return sSyncAdapter.getSyncAdapterBinder();
    }
}

所以我只需要注入服务,我就完成了.以下是解决这个问题的方法:

public class SyncService extends Service {
    @Inject
    SyncAdapter sSyncAdapter;

    /**
     * Instantiate the sync adapter object.
     */
    @Override
    public void onCreate() {
        AndroidInjection.inject(this);
    }

    /**
     * Return an object that allows the system to invoke the sync adapter.
     */
    @Override
    public IBinder onBind(Intent intent) {
        return sSyncAdapter.getSyncAdapterBinder();
    }
}

这是同步适配器:默认构造函数是隐藏的(私有),新构造函数是为Dagger制作的:它直接SyncService作为上下文并注入后端和其他对象(在我的例子中,是一个存储库类).

public class SyncAdapter extends AbstractThreadedSyncAdapter {
    private static final String TAG = SyncAdapter.class.getSimpleName();

    private Backend mBackend;

    private PostRepository mRepository;

    @Inject
    SyncAdapter(SyncService service, Backend backend, PostRepository repo) {
        this(service, true);
        mBackend = backend;
        mRepository = repo;
    }

    private SyncAdapter(Context context, boolean autoInitialize) {
        super(context, autoInitialize);
    }

服务注入的新子组件:

@Subcomponent(modules = {})
public interface SyncServiceSubcomponent extends AndroidInjector {
    @Subcomponent.Builder
    abstract class Builder extends AndroidInjector.Builder {
    }
}

这是引用该子组件的模块.它提供了构造函数(resp.)所期望的SyncService(并且AuthenticatorService,它以完全相同的行为实现):SyncAdapterAuthenticator

/**
 * Used to provide/bind services with a factory
 * Services can't be injected in the constructor so this is required
 */
@Module(subcompOnents= {
        SyncServiceSubcomponent.class,
        AuthenticatorServiceSubcomponent.class,
})
public abstract class ServicesModule {
    @Binds
    @IntoMap
    @ServiceKey(SyncService.class)
    abstract AndroidInjector.Factory bindSyncServiceInjectorFactory(SyncServiceSubcomponent.Builder builder);

    @Binds
    @IntoMap
    @ServiceKey(AuthenticatorService.class)
    abstract AndroidInjector.Factory bindAuthenticatorServiceInjectorFactory(AuthenticatorServiceSubcomponent.Builder builder);
}

因此,同步适配器具有以下依赖项:

同步服务:由.提供 ServicesModule

后端,存储库等:应用程序逻辑

服务注入:子组件

也许这可以帮助别人.


推荐阅读
  • zuul 路由不生效_Zuul网关到底有何牛逼之处?竟然这么多人在用~
    作者:kosamino来源:cnblogs.comjing99p11696192.html哈喽,各位新来的小伙伴们,大家好& ... [详细]
  • 五、RabbitMQ Java Client基本使用详解
    JavaClient的5.x版本系列需要JDK8,用于编译和运行。在Android上,仅支持Android7.0或更高版本。4.x版本系列支持7.0之前 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • CentOS 6.5安装VMware Tools及共享文件夹显示问题解决方法
    本文介绍了在CentOS 6.5上安装VMware Tools及解决共享文件夹显示问题的方法。包括清空CD/DVD使用的ISO镜像文件、创建挂载目录、改变光驱设备的读写权限等步骤。最后给出了拷贝解压VMware Tools的操作。 ... [详细]
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
  • 移动端常用单位——rem的使用方法和注意事项
    本文介绍了移动端常用的单位rem的使用方法和注意事项,包括px、%、em、vw、vh等其他常用单位的比较。同时还介绍了如何通过JS获取视口宽度并动态调整rem的值,以适应不同设备的屏幕大小。此外,还提到了rem目前在移动端的主流地位。 ... [详细]
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
  • 图像因存在错误而无法显示 ... [详细]
  • 本文介绍了关系型数据库和NoSQL数据库的概念和特点,列举了主流的关系型数据库和NoSQL数据库,同时描述了它们在新闻、电商抢购信息和微博热点信息等场景中的应用。此外,还提供了MySQL配置文件的相关内容。 ... [详细]
  • 本文介绍了如何在Azure应用服务实例上获取.NetCore 3.0+的支持。作者分享了自己在将代码升级为使用.NET Core 3.0时遇到的问题,并提供了解决方法。文章还介绍了在部署过程中使用Kudu构建的方法,并指出了可能出现的错误。此外,还介绍了开发者应用服务计划和免费产品应用服务计划在不同地区的运行情况。最后,文章指出了当前的.NET SDK不支持目标为.NET Core 3.0的问题,并提供了解决方案。 ... [详细]
  • 本文介绍了在go语言中利用(*interface{})(nil)传递参数类型的原理及应用。通过分析Martini框架中的injector类型的声明,解释了values映射表的作用以及parent Injector的含义。同时,讨论了该技术在实际开发中的应用场景。 ... [详细]
  • 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之六 || API项目整体搭建 6.1 仓储模式
    代码已上传Github+Gitee,文末有地址  书接上文:前几回文章中,我们花了三天的时间简单了解了下接口文档Swagger框架,已经完全解放了我们的以前的Word说明文档,并且可以在线进行调 ... [详细]
  • Iwanttointegratesort,order,maxandoffsetinafindAllquery.Thefollowingworksfine:我想在fin ... [详细]
  • 我尝试使用Vue.js在Laravel中实现imageupload吗?但是,我不知道为什么图像 ... [详细]
author-avatar
绅(bian)士(tai)
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有