我是RxJava的新手,但我正在将它集成到一个项目中,我正在努力帮助我学习它.我遇到了一个关于最佳实践的问题.
我有一个关于如何onError
防止停止Observable
处理的问题.
这是设置:
我有一个userIds列表,我想做两个或更多的网络请求.如果任何网络请求对用户标识失败,则该用户标识将不会被更新并且可以被跳过.这不应该阻止处理其他用户标识.我确实有一个解决方案,但它涉及嵌套订阅(请参阅第二个代码块).我看到的一个问题是,如果每次呼叫失败,即使在检测到某个阈值数量失败后,也无法短路并阻止其余部分点击网络资源.
有一个更好的方法吗?
在传统的代码中:
List<String> results = new ArrayList<String>();
for (String userId : userIds) {
try {
String info = getInfo(userId); // can throw an GetInfoException
String otherInfo = getOtherInfo(userId); // can throw an GetOtherInfoException
results.add(info + ", " + otherInfo);
} catch (GetInfoException e) {
log.error(e);
} catch (GetOtherInfoException e) {
log.error(e);
}
}
Run Code Online (Sandbox Code Playgroud)
问题:
伪代码:
userid -> network requests -> result
1 -> a, b -> onNext(1[a ,b])
2 -> a, onError …
Run Code Online (Sandbox Code Playgroud) 我有一个简单的枚举:
public enum Season {
@SerializedName("0")
AUTUMN,
@SerializedName("1")
SPRING;
}
Run Code Online (Sandbox Code Playgroud)
从某个版本开始,GSON就能够解析这些枚举.为了确保,我这样做了:
final String s = gson.toJson(Season.AUTUMN);
Run Code Online (Sandbox Code Playgroud)
它按我的预期工作.输出是"0"
.所以,我尝试在我的Retrofit服务中使用它:
@GET("index.php?page[api]=test")
Observable<List<Month>> getMonths(@Query("season_lookup") Season season);
/*...some files later...*/
service.getMonths(Season.AUTUMN);
Run Code Online (Sandbox Code Playgroud)
并且还添加了日志以确定其结果:
HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient httpClient = new OkHttpClient.Builder()
.addInterceptor(httpLoggingInterceptor)
.build();
Run Code Online (Sandbox Code Playgroud)
但它失败了.@Query
完全忽略@SerializedName
并使用.toString()
,所以日志显示我.../index.php?page[api]=test&season_lookup=AUTUMN
.
我跟踪了Retrofit源并找到了RequestFactoryParser
带有行的文件:
Converter<?, String> converter =
retrofit.stringConverter(parameterType, parameterAnnotations);
action = new RequestAction.Query<>(name, converter, encoded);
Run Code Online (Sandbox Code Playgroud)
似乎,就像它根本不关心枚举一样.在这些线之前,它被测试rawParameterType.isArray()
为一个阵列或Iterable.class.isAssignableFrom()
仅此而已.
改造实例创建是:
retrofit = new Retrofit.Builder()
.baseUrl(ApiConstants.API_ENDPOINT)
.client(httpClient)
.addConverterFactory(GsonConverterFactory.create(gson))
.addCallAdapterFactory(RxJavaCallAdapterFactory.create()) …
Run Code Online (Sandbox Code Playgroud) warp中的线程在物理上是并行的,所以如果其中一个(称为线程X)启动一个原子操作,那么其他什么呢?等待?这是否意味着,当线程X被推送到原子队列时,所有线程都将等待,获取访问权限(互斥量)并使用该互斥锁保护内存,然后重新安排互斥锁?
有没有办法把其他线程用于某些工作,比如读取一些内存,所以原子操作会隐藏它的延迟?我的意思是,15个闲置的线程......不太好,我想.Atomic真的很慢,不是吗?我怎样才能加速它呢?是否有任何模式可以使用它?
使用共享内存的原子操作是否锁定了银行或整个内存?例如(没有互斥),有__shared__ float smem[256];
atomicAdd(smem, 1);
atomicAdd(smem + 1, 1);
这些线程适用于不同的银行,但通常是共享内存.他们是运行parralel还是排队?如果Thread1和Thread2来自分离的warp或一般的warp,那么这个例子有什么不同吗?
我必须在汇编程序上编写伪随机生成器,没有任何浮点/双操作和函数,如sin/cos,sqrt等.所以我不能使用通用方法来做到这一点.我也有随机数限制:00-0F.我怎样才能做到这一点?
据我所知,我首先需要生成统一数字.我这样做是这样的:x = (13 * x + 7) % 16;
(但它有一个问题-这是有史以来的unifromest分布如果产生15个号码,我知道所有的人,我可以说,16日有100%的概率,因为那里是本期无重复是16. (模块)).
之后,我需要将这些数字重新生成为高斯数.我在互联网上找到了这个解决方案,但它不起作用.
for (i = 0; i < N; ++i) // N - amount of randomized numbers
{
++gx[x = (a * x + c) % m]; //gx - histogram of x
xm[i] = x; // xm - massive of randomized numbers in uniform
y = 0;
for (j = 0; j < i + 1; ++j)
{
y += xm[j] * n - j; // n - …
Run Code Online (Sandbox Code Playgroud) 我正在尝试自动安装我的插件.Mozilla说这很简单,但是:
while
在.bat文件或sleep
milisec中找到任何循环.activate.bat
,并cfx xpi
在一个CMD窗口顺序,也毕竟使用wget在其他CMD.即使第二部分我该怎么办?我尝试过类似的东西:
START cmd /K "activate "cfx xpi"" && wget --post-file=tst-closing-cur-tab.xpi http://localhost:8888/
要么
START cmd /K "activate && "cfx xpi"" && wget --post-file=tst-closing-cur-tab.xpi http://localhost:8888/
但它总是cfx
在CMD中运行,而不是在"虚拟CMD"之后运行activate