我的代码中有一个变量,说它是"状态".
我想根据此变量值在应用程序中显示一些文本.这必须在特定的时间延迟下完成.
就像是,
检查状态变量值
显示一些文字
等待10秒钟
检查状态变量值
显示一些文字
等待15秒
等等.时间延迟可能会有所不同,一旦显示文本就会设置.
我试过Thread.sleep(time delay)但失败了.有没有更好的方法来完成这项工作?
我想知道我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的线程中调用?
我需要将一个LiveData对象返回的一种数据转换为后台线程上的另一种形式,以防止UI滞后.
在我的具体案例中,我有:
MyDBRow对象(由原始longs和Strings 组成的POJO );LiveData<List<MyDBRow>>; 和MyRichObject对象(POJO与原语膨胀成例如日期/时间对象)所以我需要将我LiveData<List<MyDBRow>>变成一个LiveData<List<MyRichObject>>,但不是在UI线程上.
该Transformations.map(LiveData<X>, Function<X, Y>)方法需要转换,但我不能使用它,因为它在主线程上执行转换:
将主线程上的给定函数应用于
sourceLiveData 发出的每个值,并返回生成结果值的LiveData.给定的函数
func将在主线程上执行.
什么是进行LiveData转换的简洁方法:
android android-thread android-room android-architecture-lifecycle android-architecture-components
我不知道我对代码做了什么改变,使我的应用程序变得超级慢,现在启动大约需要两分钟,但之前不到 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) 如果内部的操作在CoroutineScope(job+Dispatchers.Main){...}主线程上运行,那么它为什么不违反 Android 的要求,即不允许在主/UI 线程上运行慢(阻塞)操作(网络等)?我可以在此范围内运行阻塞操作,并且 UI 根本不会冻结。
如果有人能解释幕后发生的事情,我将不胜感激。我的猜测是它类似于 JavaScript 如何使用事件循环管理阻塞操作,但我很难找到任何相关材料。
我有一个简单的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);.我正在使用 CAMERA2 API,同时开发一个没有任何错误的应用程序,该应用程序将运行得非常好。但是在录制了一些片段后,它会显示上述错误。
这是我的做法,
1.使用cameraManager类打开相机,然后将视频预览设置为纹理字段
没有任何问题,它会创建许多(大约 200-300)个摄像头会话。但突然它发生在错误之下。我已经给了一些时间来设置相机会话并使用Timerclass 和TimerSchduleclass发布这些会话。
我已经阅读了这个, 这里和这里为了提取到底发生了什么。思想需要一些进一步的帮助。
我想知道的是
这个错误是什么意思?
一般来说,为什么这些错误发生在
编辑 :
错误--->>>>
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) 后台线程是否PagingData像with一样自动管理PagedList,然后在主线程上返回?
从下面的日志中,PagingData与PagedListPaging 2 的库相比,它似乎没有在 Paging 3 库中的后台线程上运行。
期望(基于Paging Codelab示例)
override suspend fun load(...)在 IO 线程上运行。viewModel.searchRepo(query).collectLatest { ... }在主线程上运行。观察
override suspend fun load(...)和SearchRepositoriesActivity viewModel.searchRepo(query).collectLatest { ... }主线程上运行。螺纹是通过在背景处理PagedList与toLiveData根据文档。
如果您使用 LivePagedListBuilder 获取 LiveData,它将在后台线程上为您初始化 PagedLists。
Paging 3文档没有提到线程是如何管理的。但是,从日志中,PagingSource似乎在主线程上运行网络请求并在主线程上返回PagingData。
我在CryptoTweets示例应用程序 app-simple …
android kotlin android-thread android-jetpack android-paging
我对Room感到困惑,无法在文档中找到答案。
因此,库在单独的线程上强制使用查询,这是可以理解的。但是,Delete 查询似乎不包含在此限制中,可以从 UI 线程自由调用。它们也总是返回原始输出值,而没有机会将其包装在 Observable 中。
什么是用在删除调用正确的方法客房然后?它应该在单独的线程上运行吗?如果不是,那么性能和并发修改呢?
我想创建一个completable并在后台线程中运行它,但它不是打电话Action的run()时候,我就订阅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()。
所以问题是我想从绝对路径获取位图,所以我将这些路径传递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) 因此,在 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 ×12
android-thread ×12
android-room ×2
opengl-es ×2
android-architecture-components ×1
android-architecture-lifecycle ×1
kotlin ×1
performance ×1
realm ×1
rx-android ×1
rx-java ×1