我正在使用Retrofit库对我正在使用的服务进行REST调用.
如果我对我的服务进行API调用并出现故障,该服务会返回一些JSON以及标准的HTTP错误内容.使用RetrofitError故障回调中包含的对象,我能够找到HTTP状态代码和其他几个东西,但是我无法检索服务发回的JSON.
例如,假设我调用了我尝试创建用户的API.如果用户名已经存在,该服务将返回400错误代码以及一些JSON,如下所示:
{"error":"Username already in use"}
Run Code Online (Sandbox Code Playgroud)
因为一个简单的400错误代码不够具体,我真的需要访问返回的JSON.
有谁知道我如何获得这个JSON数据?我试着查看RetrofitError对象中的每个字段,但无法在任何地方找到它.我还需要做些什么吗?
我想要完成的描述: 我有一个应用程序使用FragmentActivity和LinearLayout作为片段的容器.我单击FragmentActivity UI上的不同按钮,并在FragmentActivity中的容器中添加和删除Fragments.除了单击FragmentActivity UI上的按钮之外,每个Fragment还有可以单击的按钮,这些按钮将删除当前片段并在其位置添加不同的片段.
Android的操作方式我理解它: 我一直在阅读如何做到这一点,据我所知,"正确"的做法是使用FragmentActivity作为中继站的一种,并拥有每个片段对FragmentActivity进行回调以传达事件并处理它们.
场景: 让我们说FragmentActivity正在显示Fragment A,当用户点击FragmentA中的一个按钮时,我想停止显示FragmentA并开始显示FragmentB.为此,我在FragmentA中创建了一个名为AListener的接口.在FragmentA的onAttach()方法中,我使用建议的方法来检查FragmentActivity是否实现了AListener.当单击FragmentA中的按钮时,我使用AListener中的一个回调方法将click事件传递给FragmentActivity.在FragmentActivity中,我创建了FragmentB的一个实例,并将其添加到FragmentActivity中的容器中.然后,如果FragmentB中发生了某些事件,我使用相同的方案将事件传递给FragmentActivity并做一些有趣的事情.
所以有什么问题? 对于我的应用程序,我发现这种方案让Fragments回调FragmentActivity然后让FragmentActivity创建一个新的片段或调用前向和现有的片段非常麻烦.我有很多片段需要由FragmentActivity显示,因此我为每种需要显示的片段实现了一个接口(每个片段都不同,所以每个片段都有自己的接口).当我有两个具有相同方法签名的接口并且我被迫重命名其中一个方法时,这会导致冲突.
例如,如果我想使用片段的onAttach()方法将侦听器附加到片段,那么我的FragmentActivity必须实现该接口.我找到了几个实例,其中我有相同名称的回调方法(或者由于名称空间冲突,我不得不将它们命名为类似但不同的东西).对此的一个解决方案是使用匿名类作为回调而不是让FragmentActivity实现接口.这看起来效果不错,但与Android文档中关于使用onAttach()方法设置监听器的内容相反.
有没有优雅的方法来解决这个问题? 在我看来,权衡的是你要么强制FragmentActivity为你想要在其中显示的每个Fragment实现一个接口,并且有注意方法签名冲突的有趣问题,要么你反对Android文档并使用Anonymous用于处理回调的类(不确定其含义).
我对Java很新,觉得我可能会错过一个可以解决我的问题的概念.任何人都可以直截了当地说明如何优雅地解决这个问题?
我正在编写一个长期运行的后台服务,用于收集和分析设备数据.为此,我启动一项服务,该服务生成一个线程,该线程进行数据收集/分析.
从我的阅读中我了解到,如果我希望服务在屏幕被锁定/设备正在休眠时这样做,我应该使用部分唤醒锁来确保cpu在服务的线程运行时不会进入休眠状态.但是我真的对此感到困惑,因为我目前没有使用唤醒锁,我可以通过任务管理器来设置我的应用程序或锁定屏幕或杀死应用程序,每次我这样做,我都可以通过logcat和记录我在服务中生成的线程仍在运行并执行我想要的工作.
我甚至运行了一个adb shell dumpsys电源,发现我的唤醒锁定了refcount = 0,这表明一个不同的应用程序没有为我拿着唤醒锁.
我真的很幸运,我的服务似乎在没有唤醒锁的情况下在后台运行得很好吗?
编辑: 当连接到USB和从USB分离时,设备已显示此行为.我定期将我收集的数据上传到服务器并运行测试,我从不插入设备并让屏幕锁定整个测试,我仍然看到我的线程运行和数据上传.
如果用户正在运行我的应用程序并决定通过任务管理器将其终止,那么在进程终止之前是否有任何代码可以保证执行多少代码?
我觉得它可以停止在任意线上运行,但我想我真的不知道答案.
示例用例是用于停止和重新启动后台警报.如果我想取消闹钟,做一些工作,然后重置闹钟,我觉得应用程序有可能在"取消闹钟"步骤之后但在"重置闹钟"步骤之前停止运行.这会让我处于一种我不想进入的状态,因为我总是希望将来我的闹钟能够启动.(请记住,这只是一个例子,我不是在寻找这个特定情况的解决方法).
我能做些什么来确保代码我的java代码作为类似于db事务的"事务"运行,以便它可以全部运行还是不运行?
我正在构建一个 Android 项目,该项目有一些使用 Proguard 的 buildType。在构建过程中,我看到来自 Proguard 的大量警告。因为这些警告是为我正在使用的第三方类生成的,所以我试图在我的“proguard-rules.pro”文件中使用 -dontwarn 标志和 -dontnote 标志,这样我以后就不会看到错误输出. 但是,我看到的问题是,即使在我将这些标志添加到我的 .pro 文件并在 build.gradle 中指定 .pro 文件之后,我仍然会在构建项目时看到警告输出。
这是 build.gradle 文件的相关部分:
buildTypes {
debug {
applicationIdSuffix ".debug"
}
unitTest {
applicationIdSuffix ".unittest"
minifyEnabled true
// proguardFiles getDefaultProguardFile("proguard-android.txt")
proguardFile('proguard-rules.pro')
}
automation {
applicationIdSuffix ".automation"
minifyEnabled true
// proguardFile getDefaultProguardFile('proguard-android.txt')
proguardFile('proguard-rules.pro')
}
internal {
applicationIdSuffix ".internal"
minifyEnabled true
// proguardFiles getDefaultProguardFile('proguard-android.txt')
proguardFile('proguard-rules.pro')
}
release {
minifyEnabled true
// proguardFiles getDefaultProguardFile("proguard-android.txt")
proguardFile("proguard-rules.pro")
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的 proguard-rules.pro 文件:
# Add project specific ProGuard …Run Code Online (Sandbox Code Playgroud) 几天前,我在尝试在我的Galaxy S2上安装.apk时遇到了麻烦.我选择手机作为目标,单击确定,然后在控制台中出现以下错误:
无法在设备'设备号'上安装AvatarRun.apk:超时启动已取消!
不改变代码中的任何内容并再次运行我也可以得到错误:
无法在设备'设备号'上安装AvatarRun.apk:找不到设备com.android.ddmlib.InstallException:设备未找到启动已取消!
我试过打开命令窗口并导航到android-sdk\platform-tools并运行:
adb kill-server adb start-server
这并没有解决问题.
这似乎只是一个巧合,但在多次失败之后我将Manifest中的最小SDK从10改为7并且在下次尝试时加载了.apk,但是之后已经间歇性地工作并产生相同的错误.
任何人都可以建议找到导致此错误的方法吗?
我有一个Android活动,正在使用Dagger2将Presenter注入其中。我希望Presenter能够保持状态,即使发生配置更改也是如此。
例如,我将使用Presenter发起网络呼叫,如果用户在进行网络呼叫时旋转设备,我希望能够在设备完成旋转之后接收响应,并且不必重新启动呼叫。
我被绊倒了,因为如果我将Presenter实例的范围限定在Activity的生命范围内,那么当Activity在配置更改期间通过onDestroy()进行操作时,Presenter不会被垃圾回收吗?我的另一个想法是使用在应用程序生命周期内有效的范围。但是,如果这样做,我如何确保一旦Activity被永久销毁(不是由于配置更改,而是按下返回按钮之类的东西),就可以对Presenter进行垃圾收集?
有没有一种方法可以确保我的Presenter在活动的配置更改中不会丢失,并且在应用程序的生命周期内不会泄漏?
我正在使用RxJava和Retrofit2(使用OkHttp作为HTTP客户端)进行网络连接,并试图了解Retrofit2如何处理不同的错误以及它们从RxJava方面的外观.以下代码说明了网络调用的RxJava订阅者回调(使用Retrofit进行).
Subscription subscription = observable
.subscribeOn(mScheduler)
.observeOn(mAndroidScheduler)
.subscribe(new Subscriber<User>() {
@Override
public void onCompleted() {
Timber.d("onCompleted called");
mRetainerView.clearUserObservable();
mActivityView.hideProgressBar();
mActivityView.enableUi();
}
@Override
public void onError(Throwable e) {
Timber.d("onError called");
Timber.d(e.toString());
mRetainerView.clearUserObservable();
mActivityView.hideProgressBar();
mActivityView.enableUi();
}
@Override
public void onNext(User user) {
Timber.d("onNext called");
mRetainerView.clearUserObservable();
mActivityView.hideProgressBar();
mActivityView.enableUi();
mActivityView.launchMainActivity();
}
});
Run Code Online (Sandbox Code Playgroud)
我的问题是,在什么情况下会调用onError(),一旦调用它,我如何查询Throwable来确定原因?
从Retrofit源看,可能看到的唯一Throwable是IOException和HttpException.任何人都可以验证这是真的吗?
我正在使用 ScheduledExecutorService 定期运行 Runnable。在 Runnable 中,我注册了一个 SensorEventListener。我注意到 SensorEventListener 回调在主线程上调用,而不是在 ScheduledExecutorService 的线程池中调用。我想从主线程处理传感器事件的回调。看起来我可以在调用 SensorManager 类的 registerListener() 时传递一个 Handler 对象,并且回调将在 Handler 所在的线程上运行。
有没有办法获得对 ScheduledExecutorService 的处理程序的引用?