小编Leo*_*hen的帖子

在调用AsyncTask :: execute之后,AsyncTask的doInBackground开始执行得太晚

我写了一个AsyncTask,大部分时间它的构造函数被调用并且其doInBackground被调用(0毫秒延迟)之间没有延迟.但是每当在后台进行联系人同步时,我的AsyncTasks的构造函数和doInBackground之间经常会有1-3秒的延迟.在我的情况下,这种延迟是不可接受的.我知道AsyncTask是一个后台线程,这个问题可以通过使用Thread并将其优先级设置得更高来解决.但我想知道的是,我怎么知道是什么导致我的AsyncTask的doInBackground被调用?我使用了adb shell top -m 10,当这个问题发生时,进程使用似乎很正常.

任何帮助表示赞赏.

谢谢

android android-asynctask

13
推荐指数
2
解决办法
5635
查看次数

onStart()调用startService()有时会导致Android O中的异常

我们的应用针对的是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()更安全吗?

android android-service

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

在ViewPager中使用View或Fragment

我有一个关于是否在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一起使用的麻烦?

谢谢

android android-viewpager

6
推荐指数
1
解决办法
3502
查看次数

以编程方式获取当前 CPU 频率

我正在尝试获取当前的 CPU 频率并定期将其更新到 UI。

如下图所示,我能够通过读取cpuinfo_min_freqcpuinfo_max_freq文件来获得最小/最大 cpu 频率。我被卡住的是我不知道如何获得当前的 cpu 频率,因为 cpuinfo_cur_freq 需要 root 访问权限。

我知道这可以做到,因为我下载了许多能够显示当前 CPU 频率的应用程序(包括 CPU 统计数据)。

CPU Stats 应用程序的屏幕

感谢你的帮助。

谢谢!

linux android

5
推荐指数
0
解决办法
647
查看次数

错误:在 Fragment 中膨胀 TabLayout 时出现 java.lang.ClassNotFoundException

每当 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)

android android-layout android-tablayout

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

改造 - 处理刷新令牌过期

当我的应用程序的访问令牌过期时,我使用刷新令牌通过 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 oauth retrofit okhttp retrofit2

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

更改 Android TV 上的默认启动器

我能够更改 Android Studio 模拟器上的默认启动器,但无法在物理 Android TV 上执行相同的操作。

我就是这样做的:

  1. 将以下行添加到清单中<category android:name="android.intent.category.HOME" />,告诉系统我的应用程序也是一个启动器。
  2. 通过执行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 上的默认启动器?

谢谢!

android android-tv leanback

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