小编Mar*_*een的帖子

Android Studio 2.0 - 应用程序首次运行暂停/白屏

自升级到Android Studio 2.0(稳定版)以来,我注意到我安装的Android Studio 1.5早期版本中没有的问题.

我正在开发一个当前项目,我将构建(调试版本)并在真实设备和模拟器上运行,我在Android Studio 1.5中这样做.

自从我在构建(调试)同一个项目/应用程序并运行它时升级Android Studio 2.0后,我注意到我在设备或模拟器上暂停了.在应用程序打开之前,我得到了一个白色的屏幕几秒钟,这是我之前在AS 1.5中没有的,应用程序会立即打开,没有暂停,没有白屏 - 无论手机是否使用ADB插入,都会出现这种情况,或拔掉插头.如果应用程序仍然在手机内存中,它会立即打开,但如果手机重新启动,我会在应用程序打开时获得暂停和白屏.

他们是解决这个问题的吗?还有其他人经历过这个吗?我可能有点为时尚早,因为我尚未完成发布版本,但这似乎是一个奇怪的问题 - 如果这是一个问题!

编辑:

我正在使用Instant Run,但是无论设备是否插入都会发生这种情况.如果未插入,Instant Run是否会对其执行产生影响?

更新:

如下所示,在Android Studio 2.0中关闭"即时运行"选项可以解决问题.有趣的是,评论表明,使用Instant Run时APK尺寸较小.这是什么意思?可能是Instant Run使用旧的Dalvik/JIT编译器而不是ART吗?这可以解释Apk大小差异和滞后(Dalvik在飞行中编译 - JIT).每次应用程序运行时,ART都需要安装/编译,这意味着它的Apk大小会更大,执行速度也会更慢,就像这样.

希望有更多经验和知识的人可以确认或揭穿这个......

android android-studio

31
推荐指数
1
解决办法
9682
查看次数

Dagger 2,Gradle Plugins和Jack - 需要指导

我正在使用Dagger 2(DI库的第一次用户)和Android Studio(AS 2.1.2 - SDK 24),显然我的第一个想法是"为了使用它需要哪些依赖项?"

看了一些例子,我可以看到你需要在顶级build.gradle文件中需要一个注释处理器插件:

    classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
Run Code Online (Sandbox Code Playgroud)

现在,Module关卡中的依赖项build.gradle应用了apt插件,Module所以我最终得到了类似的东西:

apply plugin: 'com.neenbedankt.android-apt'

// other generic settings - android / buildTypes etc.

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    .
    .
    compile 'com.google.dagger:dagger:2.6'
    apt 'com.google.dagger:dagger-compiler:2.6'
    provided 'javax.annotation:jsr250-api:1.0'
}
Run Code Online (Sandbox Code Playgroud)


问题

在我的项目中,我一直在使用Jack Tool Chain和Java 8,发现上面的配置与Jack不兼容.

为了让Jack和Dagger 2合作,研究了我需要的东西,我改变了以下内容:

gradle-wrapper.properties:

变成 :

distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip

build.gradle(顶级)

变成:

classpath 'com.google.guava:guava:19.0' // added after getting NoSuchMethod Error - it solved the issue
classpath 'com.android.tools.build:gradle:2.2.0-alpha7'
Run Code Online (Sandbox Code Playgroud)

build.gradle(模块级)

变成:

compile …
Run Code Online (Sandbox Code Playgroud)

android java-8 android-gradle-plugin dagger-2

9
推荐指数
0
解决办法
778
查看次数

多个活动/片段和模型视图Presenter模式

首先,我知道使用Model View Presenter有不同的实现,在我看来,只要你清楚地定义了抽象层并完成了他们指定的角色,那么你如何实现这种模式是开放的解释.我在很多只有一个应用程序的应用程序中实现了这种模式Activity.我现在已经开始了一个具有多个活动并附加的新项目Fragments,包括嵌套片段(ViewPager).

我现在正试图将MVP翻译成这个项目,我已经打了一个概念墙,想要一些指导和见解.

到目前为止,我已经创建了上述结构,开始做一个1:查看&主讲人(不管1的关系ActivityFragment).我觉得这没关系,但是例如我发送了一个请求从ActivityView向其Presenter 做了一些事情,它将结果返回到ActivityView我将如何传播结果,即更新所有其他活动/片段目前不在Paused()Stop()州.我觉得在这种情况下应该有一个中央Presenter更新所有必要的Activity和Fragment Views,但我不知道如何去做.

目前,当每个ActivityFragment创建它时,它创建一个Presenter类的新实例,将其自身作为引用传递(活动和片段实现它们自己的接口),演示者将其存储为a,WeakReference并在返回结果时调用相关的接口方法.

根据文档,每当Fragments想要彼此通信和附加时,Activity您应该使用回调接口.考虑到这一点,我应该有一个回调接口,该活动器具和Fragments回调时,他们要求的东西,所以在本质上只是活动将有一个片段具有回调,以便使各种请求演示和模型层?

对不起,如果这听起来有点混乱,希望这足以清楚地了解我想要达到的目标,如果我正在思考正确的方向......或者完全不合适!

mvp android design-patterns android-fragments android-activity

8
推荐指数
1
解决办法
2548
查看次数

Android Google Play/Drive Api

您好我正在使用Google Drive Api使用AppDataFolder工具存储数据库.我有一个测试应用程序在一台设备上成功运行.我能够上传/更新/删除/下载数据库文件,并将其重新集成到程序中,没有任何问题.

我遇到的问题是,当我想与运行相同应用程序的其他设备共享此数据库时,事情无法按预期工作.示例设备AI上传数据库,设备B - 我想下载数据库但没有找到文件(这种延迟可能在几秒到几小时之间变化很大).原因 - 当使用Api时,它决定何时"同步"数据,因为它排队而不是即时上传.因此,当在一台设备上使用时,这不是问题,因为它需要来自云存储的"同步"文件或等待同步的文件.

我尝试过各种各样的事情,例如尝试列出所有AppDataFolder文件或通过带有可搜索过滤器的查询检索元数据,然后再发出请求更新/删除等等.但是,我无法让它根据需要从根本上选择何时同步.

所以我的实际问题是:如何在我需要时强制Google Drive同步我的文件,即每次发出请求时,都可以使用同一个应用程序在多个设备上实现同步.必须有一个答案,因为我认为这是你使用AppDataFolder的第一个根本原因.

提前致谢

编辑/ UPDATE:

我已经能够在Api中找到一个选项,使用以下代码"同步"驱动器内容:

            // try to sync
            Drive.DriveApi.requestSync(mGoogleApiClient).setResultCallback(new ResultCallback<com.google.android.gms.common.api.Status>() {
                @Override
                public void onResult(com.google.android.gms.common.api.Status status) {
                    if (!status.getStatus().isSuccess()) {
                        Log.e("SYNCING", "ERROR" + status.getStatusMessage());
                    } else {
                        Log.e("SYNCING", "SUCCESS");
                        // execute async task to list AppFolderContents
                        new AppFolderContentsAsyncTask(getActivity()).execute();
                    }
                }
            });
Run Code Online (Sandbox Code Playgroud)

这适用于快速连续3/4次尝试,但是我达到了同步限制和状态消息:

超出了ERRORSync请求速率限制.

是否有任何方法可以提高请求率,因为如果我必须有一个提示用户的应用程序'请稍后再试一次同步 - 不确定你需要多久等到你可以!

解决方案 - 对于港口和我的想法(其价值)

我正在寻找的解决方案(通过电子邮件发送一个发布了同步而没有问题的驱动器应用程序的应用程序开发者)是使用Drive REST Api,而不是更新(和Google首选)的Drive API.我尝试将'requestSync'限制为仅当用户导航到带有Drive选项的片段(而不是每个文件事务)时.然而,这可能会解决大多数情况下的requestSync速率限制,但它仍然可以达到该限制.此外,如果多个设备正在运行应用程序,并且链接到同一个驱动器帐户同时在应用程序中同步/上传/删除文件,则可能会失去同步 - 可能是一种罕见的情况,但仍然可能.在用户体验或应用程序设计方面,我不认为让用户等待同步文件是一个可行的选择.

但好奇 - 实际的Drive应用程序允许您根据需要多次刷新(requestSync?).我在网络界面上快速连续创建了20个文件夹,在创建每个文件夹后,我刷新了手机上的云端硬盘应用程序并同步了20次.谷歌似乎理解同步的重要性,但选择在新的Drive API中确保这一点非常困难.如前所述,将文件上传到云存储通常会立即发生(它排队等候,但是如果你有连接,它几乎会立即发生).我认为这是移动数据/更新驱动器内容方面的代价高昂的交易,而不仅仅是查询文件的同步.但是,您可以一次一个地向您的驱动器应用程序添加文件,并且几乎立即上传一个文件 - 在30秒内请求同步超过4次然后失败并且您必须'冷静下来' 一阵子.

我对编程/ Android一般都很陌生 - 只要我学到新东西,我就会意识到我实际上并不知道,所以如果他们使用Drive API(而不是REST API)是更好的解决方案我会非常欢迎它.

android google-api google-drive-api google-drive-android-api

5
推荐指数
1
解决办法
1517
查看次数

MediaPlayer、打盹模式、唤醒锁和前台服务

我已经阅读了几篇关于 Android M 中新的“打盹”模式的帖子,还有 Android 开发者网站上的文章:https : //developer.android.com/training/monitoring-device-state/doze-standby.html但我仍然在手机(Android 6.0.1)上正确运行的前台服务有问题。

问题:

我有一个服务,它使用 MediaPlayer 对象、服务实现onCompletiononPreparedMediaPlayer 接口处理播放音乐。

伪代码:

    public class MusicService extends Service implements MediaPlayer.OnPreparedListener,
            MediaPlayer.OnCompletionListener, MediaPlayer.OnErrorListener {

            // Class Variables/Methods etc...

            @Override
            public void onPrepared(MediaPlayer mp) {

                   mp.start();

                   // update notification using startForeground()
            }


            @Override
                public void onCompletion(MediaPlayer mp) {

                   // Go and get another music track in separate thread
                   // (Have used AsyncTask and RX Java/RX Android to test if problem is here - works …
Run Code Online (Sandbox Code Playgroud)

java android android-mediaplayer

5
推荐指数
1
解决办法
1884
查看次数

支持FragmentManager、popbackstack和屏幕旋转

我有一个奇怪的问题让我发疯!

设想:

我有ActivityA 作为启动器Activity, B 可以通过inActivity启动IntentActivity A

Activity A --> Activity B
Run Code Online (Sandbox Code Playgroud)

Activity B 有一个初始Fragment名称为FragmentC,它在 B 中实例化,Activity如下所示:

if(getSupportFragmentManager().findFragmentByTag(FragmentC.TAG) == null) {
        getSupportFragmentManager()
                 .beginTransaction()
                 .add(R.id.container,
                  FragmentC.newInstance(null), // optional bundle
                  FragmentC.TAG)
                 .commit();
}
Run Code Online (Sandbox Code Playgroud)

FragmentCI 中,有一个RecyclerViewOnClickListenerthis 上通过CViewHolder回调到托管B。此时,我启动一个(在B 中)来替换当前的C,将其称为D,然后将此事务添加到后台堆栈:ActivityFragmentFragmentTransactionActivityFragmentFragment

getSupportFragmentManager()
          .beginTransaction()
          .setCustomAnimations(
                  R.anim.fragment_slide_enter,
                  R.anim.fragment_slide_exit,
                  R.anim.fragment_slide_enter_pop,
                  R.anim.fragment_slide_exit_pop)
          .replace(R.id.container,
                        FragmentD.newInstance(bundle),
                        FragmentD.TAG)
          .addToBackStack(null)
          .commit();
Run Code Online (Sandbox Code Playgroud)

所以此时我有ActivityB 和D 以及从C …

android android-fragments

4
推荐指数
1
解决办法
2797
查看次数

Android Jetpack Compose - 动态布局

背景

我目前正在研究创建布局的选项,在项目开发过程中,我希望可能将 UI 迁移到 Jetpack Compose 或发布后,具体取决于库的稳定性/灵活性。

该项目的一部分将使用服务器驱动的 UI。然而,UI 的变化是无法提前得知的,并且将是动态的(服务器和数据驱动)。

我在处理业务逻辑和表示层方面没有任何问题,但是当涉及到 UI 时,我需要根据表示数据和视图模型动态构建 UI。

长话短说

考虑到这一点,是否可以使用 Jetpack Compose 创建动态布局(不要与动态布局数据混淆)?

作为一个最小的例子,使用传统的View方法ViewGroup可以轻松实现:

class DynamicViewActivity : AppCompatActivity() {
    
    private lateinit var root : LinearLayout

    override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {
        super.onCreate(savedInstanceState, persistentState)

        // setup view group container
        root = LinearLayout(this)
        root.orientation = LinearLayout.VERTICAL
        root.layoutParams = LinearLayout.LayoutParams(
            LinearLayout.LayoutParams.MATCH_PARENT, 
            LinearLayout.LayoutParams.MATCH_PARENT)
        
        setContentView(root, LinearLayout.LayoutParams(
            LinearLayout.LayoutParams.MATCH_PARENT,
            LinearLayout.LayoutParams.MATCH_PARENT))
        
        // some lookup to create a dynamic layout
        val children : List<Pair<View, LinearLayout.LayoutParams>> = getChildren(someArgs)
        
        // …
Run Code Online (Sandbox Code Playgroud)

android android-layout android-jetpack-compose

3
推荐指数
1
解决办法
4270
查看次数

如何在 Android Studio 中将代码推送到第二个单独的 GitHub 存储库?

我很困惑。

我的项目有它的原始 GitHub 存储库。

我必须将 Android 项目推送到第二个存储库。

如何在 Android Studio 中将代码推送到第二个单独的 GitHub 存储库?

我看到有可能的提示,但我不知道如何启动新的存储库。

问候,

git android github repository

1
推荐指数
1
解决办法
2203
查看次数