小编Pav*_*dka的帖子

在RxJava2中处理null

随着即将推出的RxJava2版本的一个重要变化是null不再被接受为流元素,即以下代码将抛出异常:Observable.just(null)

老实说,我对这种变化有着复杂的感觉,我的一部分理解它会强制执行干净的API,但是当这可能是一个问题时,我可以看到许多用例.

例如,在我的应用程序中,我有一个内存缓存:

@Nullable CacheItem findCacheItem(long id);
Run Code Online (Sandbox Code Playgroud)

CacheItem可能不存在于缓存中,因此方法可能返回null值.

它与Rx*一起使用的方式如下:

Observable<CacheItem> getStream(final long id) {
    return Observable.fromCallable(new Callable<CacheItem>() {
        @Override public CacheItem call() throws Exception {
            return findCacheItem(id);
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

所以使用这种方法,我可能在我的流中得到null,这是完全有效的情况,所以它在接收端正确处理 - 假设UI改变其状态,如果项目不在缓存中:

Observable.just(user)
          .map(user -> user.getName())
          .map(name -> convertNameToId(name))
          .flatMap(id -> getStream(id))
          .map(cacheItem -> getUserInfoFromCacheItem(cacheItem))
          .subscribe(
              userInfo -> {
                  if(userInfo != null) showUserInfo();
                  else showPrompt();
              }
          );
Run Code Online (Sandbox Code Playgroud)

使用RxJava2,我不再允许null在流中发布消息,因此我需要将我的CacheItem包装到其他类中,并使我的流生成该包装,或者进行相当大的体系结构更改.

将每个流元素包装成可空的对应元素对我来说并不合适.

我错过了一些基本的东西吗?

看起来像我这样的情况非常受欢迎,所以我很好奇在RxJava2中给出新的"无空"政策时,解决这个问题的建议策略是什么?

编辑 请参阅RxJava GitHub仓库中的后续对话

rx-java

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

使用覆盖模块扩展ObjectGraph

我现在和Dagger一起玩,显然有些功能对我不起作用.

我实际上试图ObjectGraph.plus()用mock模块扩展我的ObjectGraph(via ),它覆盖了已经创建的图形中的一个真实模块.但显然我的模拟模块被忽略了,因此调用了真正的接口.

但是,如果我尝试在图形创建阶段提供我的模拟模块 - 一切正常..

在我的情况下MockModule1覆盖提供者RealModule1

不起作用:

objectGraph = ObjectGraph.create(new RealModule1(), 
                                 new RealModule2(), 
                                 new RealModule3());

objectGraph = objectGraph.plus(new MockModule1());
Run Code Online (Sandbox Code Playgroud)

工作良好

objectGraph = ObjectGraph.create(new RealModule1(), 
                                 new RealModule2(), 
                                 new RealModule3(),
                                 new MockModule1());
Run Code Online (Sandbox Code Playgroud)

RealModule1.java

@Module(injects = MainActivity.class)
public class RealModule1 {

    @Provides
    ISomething provideSomething() {
        return new Something();
    }
}
Run Code Online (Sandbox Code Playgroud)

MockModule1.java

@Module(overrides=true, injects = MainActivity.class)
public class MockModule1 {

    @Provides
    ISomething provideSomething() {
        return new MockSomething();
    }
}
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?

java android dependency-injection dagger

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

从Android Studio gradle build访问环境变量

在我的Android Gradle构建中,我需要访问我设置的环境变量.bash.profile.当我从命令行构建时,它工作正常 - Gradle脚本可以看到所有变量.

但是,当我尝试从Android Studio运行构建时 - 我不再拥有环境变量了.

以下是我所面对的大致情况:

1)通过~/.bash.profile以下方式设置自定义环境变

export MY_CUSTOM_VAR='Hello World'
Run Code Online (Sandbox Code Playgroud)

2)在build.gradle创建任务中打印此环境变量:

task printVar << {
    println System.getenv("MY_CUSTOM_VAR")
}
Run Code Online (Sandbox Code Playgroud)

3)printVar从命令行执行.输出正确 - 设置了env变量:

输出: Hello World

4)printVar从Android Studio 执行.未设置环境变量.输出为空

常识告诉我,通过执行export MY_CUSTOM_VAR='Hello World'我只是使这个变量可用于shell进程(及其子进程).如果我从命令行启动我的Android Studio(这将继承我的环境),这可能会有效.但是,自从我从Dock启动Android Studio(顺便说一下,我在Mac上) - 它有自己的环境,对我不了解~/.bash.profile.

有什么办法可以将自定义环境变量填充到Android Studio吗?

shell android environment-variables android-studio android-gradle-plugin

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

在画布上绘制时自定义路径线样式

我正在制作地图叠加层,它突出显示沿指定点的路线,我需要实现某些线条样式(类似于截图)

路线指示 我正在尝试做的是 - 突出显示路线,如透明线条,两侧有黑色划线

到目前为止,玩不同的填充样式和Paint设置并没有让我找到任何解决方案.

有谁知道我需要找什么方向?

目前我设法只绘制实线,但这不是我想要的:

油漆设置:

mPaint.setStyle(Paint.Style.STROKE);
mPaint.setColor(COLOR_DEFAULT);
mPaint.setPathEffect(new CornerPathEffect(10));
mPaint.setStrokeWidth(6);
mPaint.setAntiAlias(true);
Run Code Online (Sandbox Code Playgroud)

绘图程序

canvas.drawPath(mPath, mPaint);
Run Code Online (Sandbox Code Playgroud)

android

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

Android Maps - animateCamera()方法无法正常工作

问题:

1)地图获取动画到达所需位置(代码中的第4行)但它已缩放到默认位置(代码中的第5行)

[将地图保留在指定缩放级别的默认位置]

2)我理解为什么问题发生但我不知道如何解决它.

3)如果我将第4行更改为moveCamera而不是将起作用的animateCamera,但我确实需要animateCamera()方法.

这是代码:

map=((MapFragment)getFragmentManager().findFragmentById(R.id.map)).getMap();
MarkerOptions options=new MarkerOptions().position(new LatLng(13.0810,80.2740));
map.addMarker(options);
map.animateCamera(CameraUpdateFactory.newLatLng(new LatLng(13.0810,80.2740)),4000,null);
map.animateCamera(CameraUpdateFactory.zoomTo(15.5f),2000,null);
Run Code Online (Sandbox Code Playgroud)

android google-maps-android-api-2 android-maps-v2

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

TileProvider图形在更高的缩放级别上会出现偏差

我目前正在玩TileProverAndroid Maps API v2,并且遇到了以下问题:我手动绘制到Bitmap中的图形在更高的缩放级别上显着偏斜:

图形是倾斜的

让我解释一下我在这做什么.我有多个LatLng点,我为地图上的每个点画一个圆圈,这样当你放大时 - 点停留在同一个地理位置.正如您在屏幕截图中看到的那样,圆圈在较低的缩放级别上看起来很好,但是当您开始放大时 - 圆圈会变得偏斜.

这就是它的实现方式:

package trickyandroid.com.locationtracking;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.util.Log;

import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Tile;
import com.google.android.gms.maps.model.TileProvider;
import com.google.maps.android.geometry.Point;
import com.google.maps.android.projection.SphericalMercatorProjection;

import java.io.ByteArrayOutputStream;

/**
 * Created by paveld on 8/8/14.
 */
public class CustomTileProvider implements TileProvider {

    private final int TILE_SIZE = 256;

    private int density = 1;
    private int tileSizeScaled;
    private Paint circlePaint;
    private SphericalMercatorProjection projection;
    private Point[] points;

    public CustomTileProvider(Context context) {
        density …
Run Code Online (Sandbox Code Playgroud)

graphics android tile google-maps-android-api-2

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

回收视图时,RecyclerView不尊重翻译

RecyclerView现在正在玩,偶然发现以下问题.当RecyclerView LinearLayoutManager决定是否关闭视图(因此它可以是回收者)时,它不会考虑视图translationY.

所以基本上,当我向上滚动并且我有正面视图时translationY,LinearLayoutManager认为视图在屏幕外,但事实上,它仍然是可见的(因为它被翻译下来).

我注意到LinearLayoutManager这个决定的方式- 通过查看getDecoratedBottom(View),所以我试图覆盖getDecoratedBottom(View)也包括翻译.不幸的是,它完全混淆了布局 - 当我们布置新项目时也会使用此方法,因此新项目会获得额外的翻译(在现有项目之上).

有一种简单的方法来告诉LinearLayoutManager一下translation属性,当其进行有关回收视图W/O重新实现决定LayoutManager从头开始?

android android-support-library android-recyclerview

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

Gradle - 继承产品风味

我有3种产品口味,不包括main:

productFlavors {
    xxx {
        applicationId 'com.xxx'
    }
    yyy {
        applicationId 'com.yyy'
    }
    zzz {
        applicationId 'com.zzz'
    }
}
Run Code Online (Sandbox Code Playgroud)

据我了解,这些产品风格继承了main资源,它看起来像这样:

        +------->xxx
        |           
main----+------->yyy
        |           
        +------->zzz
Run Code Online (Sandbox Code Playgroud)

所以,当我建立xxx,从摇篮捆绑的东西src/mainsrc/xxx文件夹.

现在,我需要它看起来像这样:

        +------->xxx           
        |                      
main----+------->yyy------->zzz
Run Code Online (Sandbox Code Playgroud)

换句话说,我想要zzz使用yyy的资源以及main.Gradle可以这样做吗?

android gradle

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

Java Regex前瞻需要花费太多时间

我正在尝试为我的问题创建一个正确的正则表达式,并且显然遇到了奇怪的问题.

让我来描述一下我要做的事情......

我的目标是从字符串的两端删除逗号.E,g,字符串, ,, ,,, , , Hello, my lovely, world, ,, ,应该变得公正Hello, my lovely, world.

我准备了以下正则表达式来完成这个: (\w+,*? *?)+(?=(,?\W+$))

它就像正则表达式验证器中的魅力一样,但是当我试图在Android设备上运行它时,matcher.find()函数会挂起〜1分钟以找到正确的匹配...我认为,问题在于我正在使用的正面预测,但是我找不到更好的解决方案,而不仅仅是从开头和结尾分别修剪逗号:

output = input.replaceAll("^(,?\\W?)+", ""); //replace commas at the beginning
output = output.replaceAll("(,?\\W?)+$", ""); //replace commas at the end
Run Code Online (Sandbox Code Playgroud)

在Java正则表达式中,我是否缺少积极前瞻的东西?如何在开头和结尾之间检索逗号之间的字符串部分?

java regex android

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

缩放时聚类地图标记,放大时不聚集

我正在使用Google Map Android集群Utitlity和Google Maps v2播放服务.

我没有得到我期望的行为.正如您在下面的两张图片中所看到的,当放大时,我可以看到一个20的簇和一个向左的单个标记,但是当我缩小直到它们在彼此的顶部时,我看不到它们的簇. 20集群仍然说20而不是21?

在此输入图像描述

在此输入图像描述

这是预期的行为吗?有没有办法可以让群集显示21而不是20+

android google-maps-android-api-2 android-maps-v2

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

dexInProcess.它有什么作用?

Google建议的构建优化之一是dexInProcess为您的构建启用(请参阅此处):

android {
    dexOptions {
        dexInProcess = true
    }
}
Run Code Online (Sandbox Code Playgroud)

有人可以解释它实际上做了什么吗?试图搜索官方文档,但没有太多关于这个功能(可能是因为android插件2.0.0仍处于alpha阶段,所以没有完全发布到公众)

android android-gradle-plugin

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

负高度值

在找到纬度,经度和海拔高度时,我得到负高度值.任何人都可以帮我找到原因吗?

gps android altitude

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