我写了一个AsyncTask,大部分时间它的构造函数被调用并且其doInBackground被调用(0毫秒延迟)之间没有延迟.但是每当在后台进行联系人同步时,我的AsyncTasks的构造函数和doInBackground之间经常会有1-3秒的延迟.在我的情况下,这种延迟是不可接受的.我知道AsyncTask是一个后台线程,这个问题可以通过使用Thread并将其优先级设置得更高来解决.但我想知道的是,我怎么知道是什么导致我的AsyncTask的doInBackground被调用?我使用了adb shell top -m 10,当这个问题发生时,进程使用似乎很正常.
任何帮助表示赞赏.
谢谢
我们的应用针对的是Android O.
阅读后台服务限制后,我注意到前台应用程序启动服务是安全的.因此,在我们的应用程序中,我们调用startService()了Fragment的onStart()方法.我们认为这是可以的,因为在本文档中它说当调用onStart时,片段对用户可见,并且当它可见时,它意味着此应用程序是前台应用程序.
但有时,我必须承认这种情况非常罕见,我们仍然会收到以下异常
java.lang.IllegalStateException:不允许启动服务Intent {act = ACTION_DEACTIVATE cmp = com.adyxe.sync/.ClientService}:app在后台uidReidRedord {db2a697 u0a19最后bg:+ 7m30s540ms空闲更改:缓存过程:1 seq (0,0,0)}
为什么会这样?onResume()为了更加确定应用程序现在是一个前台应用程序,调用startService()更安全吗?
我有一个关于是否在ViewPager中使用View或Fragment的问题.
背景:我有一个包含ListView的Activity A. 每个ListView项打开活动B.活动B显示不同的内容,具体取决于在活动A中点击的ListView项.活动B的内容显示在ListView中.
问题:现在,我不需要在活动A和B之间来回切换内容,而是要求实现水平视图滑动以在活动B中切换所有内容.我找到的一个解决方案(尝试过并且有效)是创建Activity B的ListView的许多实例,并与ViewPager + PagerAdapter一起使用.在doc上找到的另一个可能的解决方案(尚未尝试过)是将ListView引入Fragment,创建片段的许多实例并将其与ViewPager + FragmentPagerAdapter或FragmentStatePagerAdapter一起使用.
我的问题是,使用每种方法有什么好处?我是否应该解决将ListView带入Fragment或只是简单地将ViewView与ViewPager一起使用的麻烦?
谢谢
我正在尝试获取当前的 CPU 频率并定期将其更新到 UI。
如下图所示,我能够通过读取cpuinfo_min_freq和cpuinfo_max_freq文件来获得最小/最大 cpu 频率。我被卡住的是我不知道如何获得当前的 cpu 频率,因为 cpuinfo_cur_freq 需要 root 访问权限。
我知道这可以做到,因为我下载了许多能够显示当前 CPU 频率的应用程序(包括 CPU 统计数据)。
感谢你的帮助。
谢谢!
每当 Android 尝试在我的 Fragment 中扩充 TabLayout 时,我都会收到错误:java.lang.ClassNotFoundException。我正在使用 Kotlin,不确定这是否重要。
我的片段布局
<LinearLayout android:layout_height="match_parent"
android:layout_width="match_parent"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android">
<!-- our tablayout to display tabs -->
<android.support.design.widget.TabLayout
android:id="@+id/tabLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
android:minHeight="?attr/actionBarSize"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"/>
<!-- View pager to swipe views -->
<android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="fill_parent"/>
Run Code Online (Sandbox Code Playgroud)
我的 Gradle 依赖
def room_version = "2.1.0-alpha04"
implementation "androidx.room:room-runtime:$room_version"
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
annotationProcessor "androidx.room:room-compiler:$room_version"
// For Kotlin use kapt instead of annotationProcessor
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'androidx.appcompat:appcompat:1.1.0-alpha02'
implementation 'androidx.core:core-ktx:1.1.0-alpha04'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'androidx.lifecycle:lifecycle-extensions:2.1.0-alpha02'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.0.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation …Run Code Online (Sandbox Code Playgroud) 当我的应用程序的访问令牌过期时,我使用刷新令牌通过 Authenticator 类获取新的访问令牌。
我的代码如下:
if (response.code() == 401) {
Log.d("refresh", "Access token expired")
val webservice: Webservice = RetrofitClient.makeRetrofitService().create(Webservice::class.java)
var refreshToken = PreferenceData.getUserLoggedInRefreshToken(App.GetContext()!!)
var map = generateRequestBody(mapOf("refreshToken" to refreshToken!!))
var refreshResponse = webservice.refreshToken(map).execute()
if (refreshResponse != null && refreshResponse.code() == 200) {
Log.d("refresh", "New access token received")
var newToken = (refreshResponse.body() as UserLogin).token
var refreshToken = (refreshResponse.body() as UserLogin).refreshToken
PreferenceData.setUserLoggedInAccessToken(App.GetContext()!!, newToken)
PreferenceData.setUserLoggedInRefreshToken(App.GetContext()!!, refreshToken)
return response.request().newBuilder()
.header("Authorization", "Bearer $newToken")
.build();
}
}
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好。我现在想做的是当我的刷新令牌过期时,我想将用户重定向到应用程序的登录屏幕。但我的问题是,当我打电话
var refreshResponse = webservice.refreshToken(map).execute()
服务器也返回 401。所以我的问题是我不知道我收到的 401 是由于访问令牌已过期还是刷新令牌已过期。处理这个问题最合适的方法是什么?
谢谢!
我能够更改 Android Studio 模拟器上的默认启动器,但无法在物理 Android TV 上执行相同的操作。
我就是这样做的:
<category android:name="android.intent.category.HOME" />,告诉系统我的应用程序也是一个启动器。adb shell pm uninstall -k --user 0 com.google.android.leanbacklauncher和卸载 Leanback 启动器adb shell pm uninstall -k --user 0 com.google.android.tvlauncher。这是仅适用于 Android TV 的额外步骤。在我的模拟器上,它按预期工作,按 HOME 键,重复单击 BACK 键并重置设备返回到我的应用程序。
但在实体电视上,按 HOME 键就可以了。重复单击“返回”键并重置设备会进入空白屏幕。
我的问题是,是否有一种官方方法可以像 Android Mobile 一样更改 Android TV 上的默认启动器?
谢谢!