我正在尝试使用Shippable创建一个可用于构建Android项目的docker镜像.
问题是android update sdk
命令,它给出以下错误:
Installing Android SDK Tools, revision 24.2
Failed to rename directory /opt/android-sdk-linux/tools to /opt/android-sdk-linux/temp/ToolPackage.old01.
Failed to create directory /opt/android-sdk-linux/tools
Run Code Online (Sandbox Code Playgroud)
我在这里找到了一些解决方案:https://stackoverflow.com/a/8839359/867099但它适用于Windows,似乎没有解决linux上的问题.似乎在更新命令期间,当前目录正在使用中,因此无法重命名.
使用该工作方法提示我的解决方法是:
RUN cp -r /opt/android-sdk-linux/tools /opt/android-sdk-linux/tools_copy
RUN cd /opt/android-sdk-linux/tools && echo 'y' | /opt/android-sdk-linux/tools_copy/android update sdk --no-ui -a --filter tools,platform-tools,build-tools-22.0.1,android-21,extra-android-support,extra-google-google_play_services --force
Run Code Online (Sandbox Code Playgroud)
为了自动接受许可证,我echo 'y'
去了android命令.
但我认为该android
命令也应该在正确的目录中运行,这就是我cd
首先进入它的原因.
但是,它仍然失败.我很难解决如何解决这个问题,所以任何帮助都表示赞赏.
------更新--------
我在android sdk update
没有tools
过滤器的情况下运行命令,最后,我的gradle构建成功.所以我不确定不更新它们是否有问题......
我正在使用Auth0,它给了我一个JWT(json web令牌)和一个refreshtoken.我在http标头中使用此JWT与我的后端进行通信.
403
当它确定JWT已经过期时,它可能会发生,服务器给我一个.在这种情况下,我可以让Auth0使用refreshtoken向我发出一个新的JWT.这意味着我调用Auth0后端,将它传递给refreshtoken,它给了我一个新的JWT,然后我可以在我的请求中使用它.
我的问题是,如何在我的所有网络代码中有效地编写此行为?我将有几个端点可以交谈,他们都可以返回403.
我想我应该首先制作一个拦截器,将JWT添加到所有请求中.
然后应该有检测403的行为,静静地对Auth0进行网络调用,检索新的JWT.然后应该再次尝试原始请求,并在其标题中添加新的JWT.
所以我更希望将403处理到我的其他代码看不到的地方,并且绝对不必在任何地方重写它.
任何关于如何实现这一点的指示将不胜感激.
-
要清楚,我基本上是在寻找如何使用RxAndroid Observables实现这一目标的指针.当某个Observable找到403时,它应该"注入"一个新的网络呼叫.
我正在尝试将应用程序拆分为abi特定的apks,但所有apks的版本号都是相同的.他们需要不同才能上传到游戏商店.我错过了什么吗?
splits {
abi {
enable true
reset()
include 'x86', 'armeabi', 'armeabi-v7a', 'arm64-v8a'
universalApk true
}
}
Run Code Online (Sandbox Code Playgroud) 我想在我的Android应用程序中进行标准搜索,我在其中输入EditText
,等待用户完成输入,然后使用Retrofit启动网络请求:
// make observable out of EditText
Observable<OnTextChangeEvent> textObs = WidgetObservable.text(searchText);
mSearchResultSubscription =
textObs
// wait until user has not typed for 350 milliseconds
.debounce(350, TimeUnit.MILLISECONDS)
// get the string the user typed
.map(OnTextChangeEvent::text)
.map(CharSequence::toString)
// start a new observable (from Retrofit)
.flatMap(
q ->
// try network call and return my data
MyRetrofitAPI.getService().search(q)
// if this fails, just return empty observable
.onErrorResumeNext(error -> {
Log.e("Error from retrofit: " + error.getLocalizedMessage());
return Observable.empty();
})
)
// if all …
Run Code Online (Sandbox Code Playgroud) 我想要实现的是:
我知道变化何时发生,现在我假设我需要在主题上调用onNext.然后应该触发一个Rx链,最后我可以更新UI.
mViewPeriodSubject = PublishSubject.create();
mAdapterObservable =
mViewPeriodSubject
.flatMap(period -> MyRetrofitAPI.getService().fetchData(period)) // this might fail
.flatMap(Observable::from)
.map(MyItem::modifyItem)
.toList()
.map(obj -> new MyAdapter(obj));
mViewPeriodSubject.onNext("week"); // this one starts the chain
mViewPeriodSubject.onNext("year"); // this one does not
Run Code Online (Sandbox Code Playgroud)
但是在网络调用失败的情况下,可观察的错误和调用onNext()不会导致另一个网络调用.
所以我的问题是,我该如何处理?我怎样才能保持Observable完好无损,这样我就可以为它抛出另一个值?我可以想象一个简单的重试按钮,它只是想忽略发生错误的事实.
我有一个Button
我创建的Observable<OnClickEvent>
.
单击按钮时,我希望从网络中获取文件,但是我遇到了有关网络和线程的问题.
这个例子抛出android.os.NetworkOnMainThreadException
:
Observable<OnClickEvent> networkButtonObservable = ViewObservable.clicks(testNetworkButton);
networkButtonObservable
.map(new Func1<OnClickEvent, List<String>>() {
@Override
public List<String> call(OnClickEvent onClickEvent) {
return TestAPI.getTestService().fetchTestResponse();
}
}
)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<Object>() {
@Override
public void call(Object o) {Log.w("Final result: " + o);
}
}
);
Run Code Online (Sandbox Code Playgroud)
所以我尝试从另一个线程.
以下抛出rx.exceptions.OnErrorNotImplementedException: Observers must subscribe from the main UI thread, but was Thread[RxNewThreadScheduler-1,5,main]
:
networkButtonObservable
.subscribeOn(Schedulers.newThread())
.map(new Func1<OnClickEvent, List<String>>() {
@Override
public List<String> call(OnClickEvent onClickEvent) {
return TestAPI.getTestService().fetchTestResponse();
}
}
)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new …
Run Code Online (Sandbox Code Playgroud)