我想从GUI线程设置一个HandlerThread.然后一段时间后,当在GUI上单击一个按钮时,它会运行callHello(),然后将消息发送到驻留在非GUI线程上的HelloLogger对象,该线程异步记录"Hello World".我已经尝试过很多东西,有些是无限期阻塞,有些是从不接收消息等等.下面的代码或多或少都和我一样接近,请有人修改它吗?
public class HandlerThreadExample {
private MyHandlerThread mMyHandlerThread;
private Looper mLooper;
private Handler mHandler;
public HandlerThreadExample(){
mMyHandlerThread = new MyHandlerThread();
mMyHandlerThread.start();
mLooper = mMyHandlerThread.getLooper();
}
public void callHello() {
mHandler.sendEmptyMessage(1);
}
private class MyHandlerThread extends HandlerThread {
private HelloLogger mHelloLogger;
private Handler mHandler;
public MyHandlerThread() {
super("The MyHandlerThread thread", HandlerThread.NORM_PRIORITY);
}
public void run (){
mHelloLogger = new HelloLogger();
mHandler = new Handler(getLooper()){
public void handleMessage(Message msg){
mHelloLogger.logHello();
}
};
super.run();
}
}
private class HelloLogger {
public HelloLogger …Run Code Online (Sandbox Code Playgroud) multithreading android android-handler android-handlerthread
在android中,Handler可用于发布/处理消息,如果我不使用HandlerThread(将其Looper传递给Handler),这是否意味着在这种情况下Handler使用MainThread(UI Thread)的Looper?
如果Handler使用MainThread的Looper会得到什么结果?可能导致mainThread被阻止?
我收到这条警告消息,因为我看到这条消息,我也开始看到Google Play 服务没有响应弹出窗口,一段时间后它关闭了我的应用程序。我看过类似的问题,但找不到原因。
以下是我的处理程序线程使用示例。我不知道该怎么做才能避免这个问题。
@Override
public void find(Func1<RealmQuery<Artist>, RealmQuery<Artist>> query,
Action1<Result<List<Artist>>> onResult) {
if (query != null) {
handlerThread = new HandlerThread("MyHandlerThreadArtist");
handlerThread.start();
looper = handlerThread.getLooper();
Handler handler = new Handler(looper);
handler.post(new Runnable(){
@Override
public void run() {
Timber.log(Log.DEBUG, "ARTISTDAOIMPL", "find Thread.currentThread().getName() " + Thread.currentThread().getName());
mDatabase.findRealmObject(Artist.class, query,
result -> onResult.call(
Result.getData(Arrays.asList(result.data.toArray(new Artist[]{})))
), err -> onResult.call(Result.getError(err))
);
}
});
}
12-17 15:56:44.631 2944 2977 W art : Long monitor contention with owner Answers Events …Run Code Online (Sandbox Code Playgroud) multithreading android android-anr-dialog google-play-services android-handlerthread
我想请某人解释一下,HandlerThread和IntentService之间的主要区别是什么,以及主要的用例场景是什么?
我知道HandlerThread包含一个Looper,它管理messageQueue,由Handler提供.据我所知,你可以推送HandlerThread的任务,它将执行.使用非UI相关的长时间运行操作非常棒,您可以通过runOnUiThread()将结果推送回UI .
相比之下,IntentService适用于长时间运行,非uUI相关的操作,可以按顺序执行任务,当它完成调用selfStop()的作业以完成关闭时.如果一个IntentService正在处理一个任务,当一个新请求到达它时,它会添加到队列并处理第二个,当它完成第一个任务时.
从我的观点来看,他们以同样的方式做同样的工作.假设我有一个应用程序,用户点击按钮,我开始下载文件.如果用户多次点击,则新任务将排队,仅在第1次完成时启动第2次.我该怎么用?IntentService还是HandlerThread?
我是一名 iOS 开发人员,最近刚尝试过 Android 开发。
在 iOS 中,我在我的代码中使用完成处理程序。
我想知道在Android开发中是否有等价物?
谢谢
我一直想知道使用Handler( Looper.getMainLooper()) 或启动新的协程作业在主线程上执行小操作(例如更新视图)是否是更好的方法。
处理程序:
val uiHandler = Handler(Looper.getMainLooper())
fun foo() {
uiHandler.post {
someView.update()
}
}
Run Code Online (Sandbox Code Playgroud)
协程
fun foo() {
lifecycleScope.launch {
someView.update()
}
}
Run Code Online (Sandbox Code Playgroud)
我真的不知道,也无法在互联网上找到任何相关内容,但我很想获得这些知识。
android android-handler android-handlerthread android-looper kotlin-coroutines
这个错误困扰了我好几个小时.我收到了NullPointerException.问题是这个错误不一致.它发生在我启动应用程序时,但只是偶尔发生.所以我不确定是什么导致它.
我为错误日志的冗长问题道歉,但我找不到另一种询问方式.
错误日志如下:
FATAL EXCEPTION: main
Process: com.myproject.android, PID: 22175
java.lang.NullPointerException
at com.myproject.android.ImageDownloaderThread.queueImage(ImageDownloaderThread.java:74)
at com.myproject.android.NewsItemPagerActivity$NewsItemFragmentStatePagerAdapter.getItem(NewsItemPagerActivity.java:325)
at android.support.v13.app.FragmentStatePagerAdapter.instantiateItem(FragmentStatePagerAdapter.java:109)
at android.support.v4.view.ViewPager.addNewItem(ViewPager.java:832)
at android.support.v4.view.ViewPager.populate(ViewPager.java:982)
at android.support.v4.view.ViewPager.populate(ViewPager.java:914)
at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1436)
at android.view.View.measure(View.java:16497)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
at android.view.View.measure(View.java:16497)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
at com.android.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:327)
at android.view.View.measure(View.java:16497)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2291)
at android.view.View.measure(View.java:16497)
at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1912)
at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1109)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1291)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:996)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5600)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
at android.view.Choreographer.doCallbacks(Choreographer.java:574)
at android.view.Choreographer.doFrame(Choreographer.java:544)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5001)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515) …Run Code Online (Sandbox Code Playgroud) android message-queue background-thread android-handlerthread android-looper
我想在单击按钮时停止此线程。
TIME_OUT = 45000;
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
Intent i = new
Intent(MapsActivity.this,MapsActivity.class);
startActivity(i);
finish();
}
}, TIME_OUT);
Run Code Online (Sandbox Code Playgroud)
我在onCreate一个活动中使用上面的处理程序。我想阻止它。如何在单击任何按钮或单击 Back Pressed 时停止此线程?