标签: android-thread

有时间延迟重复一项任务?

我的代码中有一个变量,说它是"状态".

我想根据此变量值在应用程序中显示一些文本.这必须在特定的时间延迟下完成.

就像是,

  • 检查状态变量值

  • 显示一些文字

  • 等待10秒钟

  • 检查状态变量值

  • 显示一些文字

  • 等待15秒

等等.时间延迟可能会有所不同,一旦显示文本就会设置.

我试过Thread.sleep(time delay)但失败了.有没有更好的方法来完成这项工作?

android android-thread

202
推荐指数
7
解决办法
16万
查看次数

何时使用handler.post()&何时使用新的Thread()

我想知道我handler.post(runnable);应该何时使用,何时使用 new Thread(runnable).start();

在Handler的开发人员文档中提到:

导致Runnable r添加到消息队列中.runnable将在连接此处理程序的线程上运行.

这是否意味着,如果我写onCreate()Activity类:

Handler handler = new Handler();
handler.post(runnable);
Run Code Online (Sandbox Code Playgroud)

然后runnable将在一个单独的线程或Activity的线程中调用?

android android-handler android-thread

56
推荐指数
4
解决办法
7万
查看次数

如何在后台线程上执行LiveData转换?

我需要将一个LiveData对象返回的一种数据转换为后台线程上的另一种形式,以防止UI滞后.

在我的具体案例中,我有:

  • MyDBRow对象(由原始longs和Strings 组成的POJO );
  • 一个房间 DAO实例通过一个发射这些LiveData<List<MyDBRow>>; 和
  • 一个UI期望更丰富的MyRichObject对象(PO​​JO与原语膨胀成例如日期/时间对象)

所以我需要将我LiveData<List<MyDBRow>>变成一个LiveData<List<MyRichObject>>,但不是在UI线程上.

Transformations.map(LiveData<X>, Function<X, Y>)方法需要转换,但我不能使用它,因为它在主线程上执行转换:

将主线程上的给定函数应用于sourceLiveData 发出的每个值,并返回生成结果值的LiveData.

给定的函数func将在主线程上执行.

什么是进行LiveData转换的简洁方法:

  1. 离主线程的某个地方,和
  2. 仅在需要时(即仅在某些事物正在观察预期的转变时)?

android android-thread android-room android-architecture-lifecycle android-architecture-components

13
推荐指数
3
解决办法
4455
查看次数

如何在android上调试长监视器争用

我不知道我对代码做了什么改变,使我的应用程序变得超级慢,现在启动大约需要两分钟,但之前不到 30 秒。

我刚启动应用程序时就收到了数百条这样的消息,但没有完成任何实际工作。

W/zygote: Long monitor contention with owner pool-2-thread-12: (31043) at byte[] gj.a(byte[], java.lang.String)(:com.google.android.gms.dynamite_dynamitemodulesa@12521024@12.5.21 (040700-189987672):56) waiters=9 in byte[] gj.a(byte[], java.lang.String) for 840ms
W/zygote: Long monitor contention with owner pool-2-thread-13: (31044) at byte[] gj.a(byte[], java.lang.String)(:com.google.android.gms.dynamite_dynamitemodulesa@12521024@12.5.21 (040700-189987672):56) waiters=9 in byte[] gj.a(byte[], java.lang.String) for 912ms
W/zygote: Long monitor contention with owner pool-2-thread-20: (31059) at java.lang.String com.google.android.ads.zxxz.k.a(android.content.Context)(:-1) waiters=0 in void com.google.android.ads.tasks.e.a() for 1.362s
W/zygote: Long monitor contention with owner pool-2-thread-20: (31059) at java.lang.String com.google.android.ads.zxxz.k.a(android.content.Context)(:-1) waiters=1 in void com.google.android.ads.tasks.c.a() for 1.207s
W/zygote: Long …
Run Code Online (Sandbox Code Playgroud)

performance android android-asynctask android-thread

7
推荐指数
0
解决办法
1567
查看次数

CoroutineScope(job+Dispatchers.Main) 如何在主/UI 线程上运行?

如果内部的操作在CoroutineScope(job+Dispatchers.Main){...}主线程上运行,那么它为什么不违反 Android 的要求,即不允许在主/UI 线程上运行慢(阻塞)操作(网络等)?我可以在此范围内运行阻塞操作,并且 UI 根本不会冻结。

如果有人能解释幕后发生的事情,我将不胜感激。我的猜测是它类似于 JavaScript 如何使用事件循环管理阻塞操作,但我很难找到任何相关材料。

android android-thread kotlin-coroutines coroutinescope

7
推荐指数
2
解决办法
1436
查看次数

如何在包含OpenGL上下文和GL线程的情况下使用GLSurfaceView正确旋转Android设备?

我有一个简单的Android应用程序,使用我们的OpenGL渲染SDK将数据呈现给Android GLSurfaceView.由于我们提供和SDK供其他人使用,我们需要支持GLSurfaceViews的所有用例.目前,我们需要能够在重新创建所有Android视图并保持OpenGL上下文活动的同时旋转设备.这源于客户在横向和横向模式下需要不同的布局.

解决这个问题的正常方法是:

1.添加android:configChanges="orientation|screenSize"到您的活动中AndroidManifest.xml,您将没事.

这将不会在这种情况下,作为工作这不会重新上旋转的意见.因此,通过这样做,我们不能在横向和横向模式中具有不同的布局.

2.呼叫GLSurfaceView.onPause()GLSurfaceView.onResume()Activity.

虽然这被认为是一种很好的做法,但在这个用例中还不够,因为在执行此操作时会破坏OpenGL上下文.请注意,我们仍然这样做,它只是没有解决我们的问题.

3.使用a EGLContextFactory在旋转时保留OpenGL上下文.

这是可能的和有用的,例如在该答案中所描述的.感觉就像一个黑客,但它绝对有效.这个想法只是EGLContext在你没有一个时创建一个并重用你拥有的那个.

使用此hack时遇到的主要问题是渲染线程在GLSurfaceView分离并重新连接到视图层次结构时被销毁并重新创建.这似乎是通过查看GLSurfaceView实现来设计的.

在我们的SDK中,我们有一些线程本地存储连接到线程,所以突然得到一个新的渲染线程是不太可取的.我们可能会在渲染线程发生变化时更改某些状态,但我们想调查是否有更好的方法来执行此操作.

所以我的问题是:

答:使用EGLContextFactory"正确"的方式能够在旋转时手动保存OpenGL上下文吗?

B.有没有办法在旋转时不破坏和重新创建渲染线程(不修改源代码)?

C.在保持OpenGL上下文和渲染线程的同时,是否有更好/更简单的替代方法来实现视图销毁/重建的轮换?

额外信息:

  • 我们总是打电话setPreserveEGLContextOnPause(true);.
  • 渲染本身没有问题,只是所描述的相关问题是有问题的.

android opengl-es glsurfaceview android-thread

6
推荐指数
0
解决办法
859
查看次数

在 GL 渲染线程上收到异常:android

我正在使用 CAMERA2 API,同时开发一个没有任何错误的应用程序,该应用程序将运行得非常好。但是在录制了一些片段后,它会显示上述错误。

这是我的做法,

1.使用cameraManager类打开相机,然后将视频预览设置为纹理字段

  1. 在我们开始录制视频后,它会根据给定的时间中断,并立即再次开始录制,并会不断创建视频块,直到用户停止录制

没有任何问题,它会创建许多(大约 200-300)个摄像头会话。但突然它发生在错误之下。我已经给了一些时间来设置相机会话并使用Timerclass 和TimerSchduleclass发布这些会话。

我已经阅读了这个, 这里这里为了提取到底发生了什么。思想需要一些进一步的帮助。

我想知道的是

  1. 这个错误是什么意思?

  2. 一般来说,为什么这些错误发生在

编辑 :

错误--->>>>

10-11 12:20:58.966 27862-27988/? E/CameraDeviceGLThread-0: Received exception on GL render thread: 
                                                           java.lang.IllegalStateException: glDrawArrays: GLES20 error: 0x505
                                                               at android.hardware.camera2.legacy.SurfaceTextureRenderer.checkGlError(SurfaceTextureRenderer.java:537)
                                                               at android.hardware.camera2.legacy.SurfaceTextureRenderer.drawFrame(SurfaceTextureRenderer.java:346)
                                                               at android.hardware.camera2.legacy.SurfaceTextureRenderer.drawIntoSurfaces(SurfaceTextureRenderer.java:726)
                                                               at android.hardware.camera2.legacy.GLThreadManager$1.handleMessage(GLThreadManager.java:105)
Run Code Online (Sandbox Code Playgroud)

android opengl-es android-camera2 android-thread

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

PagingData 是否在 Paging 3 库中默认运行在后台线程上?

后台线程是否PagingData像with一样自动管理PagedList,然后在主线程上返回?

从下面的日志中,PagingDataPagedListPaging 2 的库相比,它似乎没有在 Paging 3 库中的后台线程上运行。

期望基于Paging Codelab示例

  • GithubPagingSource override suspend fun load(...)在 IO 线程上运行。
  • SearchRepositoriesActivity viewModel.searchRepo(query).collectLatest { ... }在主线程上运行。

观察

  • 无论GithubPagingSource override suspend fun load(...)SearchRepositoriesActivity viewModel.searchRepo(query).collectLatest { ... }主线程上运行。

分页 2

螺纹是通过在背景处理PagedListtoLiveData根据文档

如果您使用 LivePagedListBuilder 获取 LiveData,它将在后台线程上为您初始化 PagedLists。

分页 3

Paging 3文档没有提到线程是如何管理的。但是,从日志中,PagingSource似乎在主线程上运行网络请求并在主线程上返回PagingData

我的示例代码

我在CryptoTweets示例应用程序 app-simple …

android kotlin android-thread android-jetpack android-paging

5
推荐指数
2
解决办法
818
查看次数

如何使用 Room 正确处理线程

我对Room感到困惑,无法在文档中找到答案。

因此,库在单独的线程上强制使用查询,这是可以理解的。但是,Delete 查询似乎不包含在此限制中,可以从 UI 线程自由调用。它们也总是返回原始输出值,而没有机会将其包装在 Observable 中。

什么是用在删除调用正确的方法客房然后?它应该在单独的线程上运行吗?如果不是,那么性能和并发修改呢?

android android-thread android-room

4
推荐指数
1
解决办法
3834
查看次数

在后台线程上独立运行Completable

我想创建一个completable并在后台线程中运行它,但它不是打电话Actionrun()时候,我就订阅Schedulers.io()

基本上我想通过RxAndroid执行以下操作:

     Thread t = new Thread(new Runnable() {
        public void run() {
            doSomething();
        }
    });
    t.start(); 
Run Code Online (Sandbox Code Playgroud)

使用RxAndroid,我正在执行以下操作:

   Completable.fromAction(new Action() {
        @Override
        public void run() throws Exception {
            doSomething();
        }
    }).subscribeOn(Schedulers.io());
Run Code Online (Sandbox Code Playgroud)

它的run()方法是没有得到所谓的如果我这样做Schedulers.io(),但如果我这样做会被调用subscribe()

订阅时,我找不到它为什么运行Schedulers.io()

multithreading android rx-java rx-android android-thread

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

从文件路径获取位图

所以问题是我想从绝对路径获取位图,所以我将这些路径传递ArrayList<Strings>给我的演示者,在那里我有下一段代码:

private void decodeImageUri(final ArrayList<String> imageUris) {

    while(imageCounter < imageUris.size()) {
        DecodeBitmapsThreadPool.post(new Runnable() {
            @Override
            public void run() {

                Bitmap bitmap = BitmapFactory.decodeFile(imageUris.get(imageCounter));

                mImagesBase64Array.add(bitmapToBase64(bitmap));
            }
        });
    }
    DecodeBitmapsThreadPool.finish();
    Log.d("SIZE OF BASE64", " ---------- " + mImagesBase64Array.size());

}
Run Code Online (Sandbox Code Playgroud)

这是我的 ThreadPool 类:

public class DecodeBitmapsThreadPool {

private static DecodeBitmapsThreadPool mInstance;
private ThreadPoolExecutor mThreadPoolExec;
private static int MAX_POOL_SIZE;
private static final int KEEP_ALIVE = 10;
BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>();

public static synchronized void post(Runnable runnable) {
    if (mInstance == null) …
Run Code Online (Sandbox Code Playgroud)

android android-bitmap android-thread

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

Android:从不正确的线程访问领域。Realm 对象只能在创建它们的线程上访问

因此,在 a 中IntentService,应用程序可能处于活动状态或非活动状态,onHandleIntent被调用,我将其放置在代码下方。这是我将数据存储到领域的地方。

 Realm realm = null;
    try { 
        realm = Realm.getDefaultInstance();
        realm.executeTransactionAsync(new Realm.Transaction() {
            @Override
            public void execute(Realm realm) {

                for (AppItem item : items) {
                    AppItem item2 = realm.createObject(AppItem.class, UUID.randomUUID().toString());
                    item2.mName = item.mName;
                    item2.mCount = item.mCount;
                    item2.mUsageTime = item.mUsageTime;
                }
            }
        });
    } finally {
        if (realm != null) {
            realm.close();
        }
    }
Run Code Online (Sandbox Code Playgroud)

然后我尝试在onPostExecutein 中访问它AsyncTask,在 中doInBackground,我正在获取RealmResults<AppItem>,然后将其存储到List <AppItem>并将其发送到onPostExecute放置此代码的位置。appItems这里是 ReamObject

 Realm backgroundRealm …
Run Code Online (Sandbox Code Playgroud)

android realm android-asynctask android-thread

0
推荐指数
1
解决办法
7288
查看次数