小编Mat*_*lfe的帖子

使用android gradle + dagger运行instrumentTests

我最近开始使用Android Studio和gradle进行Android开发,并且发现它比eclipse/ant或maven更好.但是我最近开始尝试使用我的应用程序实现某种单元和/或集成测试.我能够使用谷歌最近发布的Espresso框架进行基本测试.我有一些测试,但我需要模拟和注入模拟的对象版本.我过去用过匕首换另一个项目,所以我把匕首放进了我的项目.但是现在我的测试因为以下错误而无法运行:

gradle connectedCheck
Run Code Online (Sandbox Code Playgroud)

...

4.1.2失败:由于'java.lang.IllegalAccessError'导致检测运行失败:EspressoApp:connectedCheck

我在这里创建了一个简单的演示:https: //github.com/mwolfe38/android-espresso-dagger

只需克隆然后从命令行运行:gradle connectedCheck

在上面我已经尝试了几种不同的依赖方式,最初是这样的:

dependencies {
    compile 'com.android.support:appcompat-v7:+'
    compile 'com.squareup.dagger:dagger-compiler:1.1.0'
    compile 'com.squareup.dagger:dagger:1.1.0'

    instrumentTestCompile files('libs/espresso-1.0-SNAPSHOT.jar',
            'libs/testrunner-1.0-SNAPSHOT.jar',
            'libs/testrunner-runtime-1.0-SNAPSHOT.jar')
    instrumentTestCompile 'org.hamcrest:hamcrest-all:1.3'
    instrumentTestCompile 'com.google.guava:guava:15.0'
}
Run Code Online (Sandbox Code Playgroud)

但这给了我一个关于静态初始化的错误.这似乎是由espresso框架中关于匕首的一些静态初始化代码引起的.因此,在向instrumentTestCompile添加dagger依赖项之后,我得到了上面提到的IllegalAccessError.

任何人都有运气,包括你的项目中的匕首和做咖啡测试?

android android-testing android-gradle-plugin android-espresso

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

找不到处理market:// URI的活动

我有一个bugsense帐户,我用它来跟踪我公司的Android应用程序的崩溃报告.我们的应用程序需要安装单独的应用程序(即服务),否则应用程序将无法运行.我们通过检查是否安装了其他应用程序(服务)来处理这个问题,如果没有,我们将用户引导到可以安装应用程序的maket页面,我们这样做:

Intent market = new Intent(Intent.ACTION_VIEW,
                Uri.parse("market://details?id=com.mycompany.appname"));
Run Code Online (Sandbox Code Playgroud)

startActivityForResult(market,REQUEST_INSTALL_APK);

偶尔我收到一条错误信息:

android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=market://details?id=com.mycompany.appname }
Run Code Online (Sandbox Code Playgroud)

我看到这次发生的最后一次是来自一个三星星系玩家,我们有一些在家里,他们总是为我们工作得很好.有谁知道为什么在某些情况下会发生这种情况?我还没有听到客户的任何抱怨,但似乎这可能是一个问题.

我认为用户可能已经根植了手机并卸载了游戏商店,但我非常怀疑(我们的客户是警察和非技术人员).我想知道手机上是否有设置或其他东西可能会导致无法正常工作?或者他们可能有一个旧版本的市场尚未升级,它不支持我用来指导用户进入市场/游戏商店的方法.

另请注意,我们现在只在Play商店中发布此应用程序,此崩溃所来自的版本是最新版本,除了游戏商店之外,它绝对没有进入公众.根据崩溃报告中IP地址的IPO IP,公司内部的任何人都没有在市场上分发的应用程序副本(只有3个人).这不是一个游戏或普通用户可能会使用的任何东西,但是出于特定目的,所以它不是一些脚本小子和黑客会在地下站点上玩的游戏.

android google-play

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

Maven和android - 针对不同环境的略有不同的构建

好吧我在一个Android项目上从ant切换到maven,并想知道以下是否易于实现:

目前我有一个自定义build.xml脚本,它有几个用于创建发布版本的目标.它们中的每一个都用于构建应用程序以针对不同的服务器URL运行,其中服务器可以是开发,生产,登台,甚至是我们在其他国家/地区的部署服务器.

原因是我们的应用程序将针对几个不同的服务器运行,具体取决于谁获取它,我不希望它是用户选择的东西.相反,它应该硬编码到应用程序中,这是它当前的工作方式.

这很容易在ant中设置,我只是从[env] .properties文件中获取值,然后在res/values/config.xml中替换server_url字符串.例如:

ant release-prod
Run Code Online (Sandbox Code Playgroud)

会拉读取名为prod.properties的文件,该文件定义了server_url的内容.我将config.xml文件存储在config/config.xml中,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<resources>
    <string name="config_server_url">@CONFIG.SERVER_URL@</string>
</resources>
Run Code Online (Sandbox Code Playgroud)

然后我的蚂蚁脚本这样做:

<copy file="config/config.xml" todir="res/values" overwrite="true" encoding="utf-8">
    <filterset>
           <filter token="CONFIG.SERVER_URL" value="${config.server_url}" />
    </filterset>
</copy>
Run Code Online (Sandbox Code Playgroud)

其中config.server_url在prod.properties中定义.

我想知道如何用Maven完成类似的事情?有任何想法吗.我查找了如何使用maven读取属性文件,看起来结果是混合的,无论这是否有效.

ant android maven

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

Android再次gradle复制LICENSE.txt文件

我在android上遇到这个错误(AGAIN!).最近更新到最新版本的gradle 0.7.3以及最新版本的espresso框架(1.1),我又回到了臭名昭着的"重复文件"错误.

任务':mobile:packageTesttype'的执行失败.

在APK META-INF/LICENSE.txt中复制的重复文件文件1:/Users/mwolfe/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpmime/4.2.4/dba4d4d224e2ca872af5be8d2992777583145478/httpmime-4.2 .4.jar文件2:/Users/mwolfe/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpmime/4.2.4/dba4d4d224e2ca872af5be8d2992777583145478/httpmime-4.2.4.jar

我已经设置了build.gradle文件来排除这些文件.该应用程序组装好调试/发布并运行正常,但构建/运行测试失败.特别是当我尝试使用followng命令运行仪器测试时,我得到上面提到的错误.

gradle connectedCheck
Run Code Online (Sandbox Code Playgroud)

我也有一个库项目,并尝试了每种方法来为两个构建文件添加排除项.此特定依赖项来自库项目.它们都有以下排除

packagingOptions {
    exclude 'META-INF/NOTICE.txt'
    exclude 'META-INF/LICENSE.txt'
}
Run Code Online (Sandbox Code Playgroud)

我还尝试删除上面的META-INF部分,因为它在espresso文档中显示:https://code.google.com/p/android-test-kit/wiki/Espresso#Espresso_Setup_Instructions

我知道我可以从罐子里删除这些文件,但这很痛苦.

android android-gradle-plugin android-espresso

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

xslt连接节点中的文本

我有一个xml文件,如下所示:

<args>
  <sometag value="abc" />
  <anothertag value="def" />
  <atag value="blah" />
</args>
Run Code Online (Sandbox Code Playgroud)

请记住args中的标记名称可以命名为任何东西(我不知道提前)现在我将这个xml文件存储在一个名为$ data的变量中,我使用xslt样式表中的document()调用加载它(不是xslt文件的后备数据)

我想获取该数据并产生以下输出: sometag = abc&anothertag = def&atag = blah

所以(一个非常简化的verison看起来像这样:

<xsl:template>
 <xsl:variable name="data"  select="document('/path/to/xml')" />

  <xsl:call-template name='build_string'>
    <xsl:with-param name='data' select='$data' />

  </xsl:call-template>

</xsl:template>

<!-- here is where i need help -->
<xsl:template name="build_string">
  <xsl:param name='data'>
  <xsl:value-of select='name($data/.)' />=<xsl:value-of select='$data/@value' />

  <xsl:if test='$data/following-sibling::node()'>
    <xsl:text>&#38;</xsl:text>
    <xsl:call-template name="build_str">
     <xsl:with-param name="data" select='$nodes/following-sibling::node()' />
    </xsl:call-template>
  </xsl:if>


</xsl:template>
Run Code Online (Sandbox Code Playgroud)

这几乎可以工作,但它也从输入文件打印文本节点,我不想匹配文本节点..

xml xslt xpath concatenation

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

AsyncTaskLoader用于处理方向更改的http请求,使用泛型,继承

目前我正在使用异步http库来对我们的服务器执行http请求.然而,这会带来一个问题,即如果在屏幕旋转期间正在进行http调用,我们将在调用结束时引用旧的上下文.我通过保持对onCreate中捕获的最新实例的静态引用来解决这个问题,并使用该引用调用方法(并在onDestroy中将其置空).它运作正常但似乎是一个黑客.我见过有人推荐使用片段来解决这个问题,比如这里:

http://www.androiddesignpatterns.com/2013/04/retaining-objects-across-config-changes.html

这似乎是好主意,但我想我可以通过简单地让我的Activity扩展FragmentActivity并使用AsyncTaskLoader子类来实现这一点,该子类专门用于我正在做的事情.

这是我的想法:使用ApiRequest实现AsyncTaskLoader并返回ApiResponse.但是,我希望能够继承HttpAsyncTask并覆盖一个解析响应的方法,这样我就可以解析响应并将其转换为另一种扩展ApiResponse的对象.我不知道如何指定类型参数来实现这一点.

这是我的代码:

public class HttpAsyncTaskLoader</*not sure what to put here*/> extends AsyncTaskLoader<? not sure ?> {
    private ApiClient mClient ;
    private ApiRequest mRequest;
    private volatile boolean isExecuting = false;
    public HttpAsyncTaskLoader(Context context, ApiClient client, ApiRequest request) {
        super(context);
        mClient = client;
        mRequest = request;
    }

    /**
     * Subclasses should override this method to do additional parsing
     * @param response
     * @return
     */
    protected /*subclass of ApiResponse (or ApiResponse itself)*/ onResponse(ApiResponse response) 
    {
        //base implementation just returns the …
Run Code Online (Sandbox Code Playgroud)

java generics android asynctaskloader

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

如何在 kotlin 中使用带有泛型的密封类`

我有以下课程,但我正在努力解决泛型问题


sealed class Result<T,E> {
    data class Success<T>(val data: T): Result<T,Void>()
    data class Failure<E>(val error: E): Result<Void,E>()
}


fun interface SeqListener<T,E> {
    fun onComplete(result: Result<T,E>)
}

abstract class Seq<T,E> {

    var started = false
        private set

    var complete = false
        private set

    private lateinit var seqListener: SeqListener<T,E>

    fun start(listener: SeqListener<T,E>) {
        if (!started) {
            seqListener = listener
            started = true
            return doStart()
        } else throw IllegalStateException("cannot call start on a sequence more than once")
    }

    fun success(result: Result.Success<T>) {
        complete(result) …
Run Code Online (Sandbox Code Playgroud)

generics kotlin sealed-class kotlin-sealed

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

如何在ant中获取没有扩展名的文件名

我知道如何使用java的ANT构建工具获取文件的基本名称,但在这种情况下,我想更改文件名以包含构建版本号.不幸的是,文件的名称设置在我导入的另一个ant脚本(来自android系统)中,我无法为该文件设置属性,或者导入的脚本会抱怨该属性不应该已经设置.因此,如果我有一个属性持有MyApp-release.apk并且我想将值更改为MyApp-release-1.10.apk我该怎么做?我知道我可以将1.10放在带有basename的文件名的开头,这可能就是我要做的,但我宁愿那样做.

ant filenames

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