我有一个服务,它从Internet接收命令并启动后台线程.该线程从服务传递一个处理程序(服务有界并传递处理程序)并向处理程序发送消息以拍照.我坚持执行处理程序.
static Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
//TODO: Handle different types of messages
mCamera.takePicture(null, null, MainActivity.this);
}
};
Run Code Online (Sandbox Code Playgroud)
问题:
我正在尝试构建一个Android应用程序,它将每10分钟重复运行一些进程.我发现Handlers比定时器或安排更可靠.因此,我将Handlers使用下面给出的代码来开发我的应用程序.
我有点担心以下代码会Handlers在每次启动应用程序时创建单独的并保持并行运行,可能是因为我正在创建Handleron onCreate.
那么,一次只Handler在背景中保持一次运行的最佳方法是什么?
private Handler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
handler = new Handler(); // new handler
handler.postDelayed(runnable, 1000*60*10); // 10 mins int.
setContentView(R.layout.activity_pro__sms);
}
private Runnable runnable = new Runnable() {
@Override
public void run() {
/* my set of codes for repeated work */
foobar();
handler.postDelayed(this, 1000*60*10); // reschedule the handler
}
};
Run Code Online (Sandbox Code Playgroud) 我正在使用遗留代码,我在此函数中发现了一个不一致的行为:
@Override
public void openFragment(final Class<? extends BaseFragment> fragmentClass,
final boolean addToBackStack,
final Bundle args)
{
long delay = 0;
if (mDrawerLayout.isDrawerOpen(GravityCompat.START)) {
delay = getResources().getInteger(android.R.integer.config_shortAnimTime) * 2;
}
// FIXME: quick fix, but not all cases
final Bundle args666 = args != null ? (Bundle) args.clone() : null;
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
doOpenFragment(fragmentClass, addToBackStack, args666);
}
}, delay);
closeDrawer();
}
protected void doOpenFragment(final Class<? extends BaseFragment> fragmentClass,
final boolean addToBackStack,
final Bundle args)
{ …Run Code Online (Sandbox Code Playgroud) final Handler handler = new Handler();
LOG.d("delay");
handler.postDelayed(new Runnable() {
@Override public void run() {
LOG.d("notify!");
//calling some methods here
}
}, 2000);
Run Code Online (Sandbox Code Playgroud)
"延迟"确实显示在日志中,但根本不显示.并且在其中调用的方法run()也根本不被调用.任何人都可以帮助解释为什么会发生这种情况,我做错了吗?
具有此代码的类扩展了IntentService,这会是一个问题吗?
============================
更新:我将此代码放在扩展的类中IntentService.我发现它唯一有用的地方是构造函数.但我需要把它放在onHandleIntent方法中.所以我检查了文档onHandleIntent,它说:
在工作线程上调用此方法并处理请求.一次只处理一个Intent,但处理发生在独立于其他应用程序逻辑运行的工作线程上.因此,如果此代码需要很长时间,它将阻止对同一个IntentService的其他请求,但它不会阻止其他任何内容.处理完所有请求后,IntentService会自行停止,因此您不应该调用stopSelf.
所以基于我得到的结果,我觉得我不能postDelayed在"工作线程"中使用.但是,任何人都可以解释这一点,比如为什么这不适用于工作线程?提前致谢.
android postdelayed intentservice android-handler android-intentservice
在 oppo f1 5.1 版本中运行应用程序时,logcat 显示以下错误:
ANR_LOG: >>> msg's executing time is too long
Blocked msg = { when=-15s421ms what=0 target=android.view.Choreographer$FrameHandler callback=android.view.Choreographer$FrameDisplayEventReceiver } , cost = 15162 ms
>>>Current msg List is:
Current msg <1> = { when=-15s412ms what=0 target=android.os.Handler callback=android.support.v4.content.res.ResourcesCompat$FontCallback$2 }
Current msg <2> = { when=-15s410ms what=0 target=android.os.Handler callback=android.support.v4.content.res.ResourcesCompat$FontCallback$2 }
Current msg <3> = { when=-15s408ms what=0 target=android.os.Handler callback=android.support.v4.content.res.ResourcesCompat$FontCallback$2 }
Current msg <4> = { when=-15s405ms what=0 target=android.os.Handler callback=android.support.v4.content.res.ResourcesCompat$FontCallback$2 }
Current msg <5> = { when=-15s403ms what=0 target=android.os.Handler …Run Code Online (Sandbox Code Playgroud) 我有一个作为绑定服务的应用程序。我正在向服务发送消息,但有时会出现以下错误:
E/AndroidRuntime(28216): java.lang.IllegalStateException: 指定的消息队列同步屏障令牌尚未发布或已被删除。
有时我会收到此错误:
android.util.AndroidRuntimeException: { what=888 when=0 } 此消息已被使用。
有时用户界面只是冻结。我通过处理程序从服务到活动进行通信,反之亦然。
public void init(IBinder service){
playerService = new Messenger(service);
setBound(true);
try {
Message msg = Message.obtain(null, PlayerService.MSG_REGISTER_CLIENT);
msg.replyTo = messenger;
playerService.send(msg);
while(!messageQueue.isEmpty()){
playerService.send(messageQueue.remove());
}
} catch (RemoteException e) {
// In this case the service has crashed before we could even do anything with it
Log.d(Player.TAG, "problem binding player messenger " + e.getMessage());
}
}
Run Code Online (Sandbox Code Playgroud)
这是第二次调用时始终会导致冻结的方法。
public void play(String url) {
Message msg = Message.obtain(null, PlayerService.PLAY, 0, 0);
msg.setData(getURLBundle(url)); …Run Code Online (Sandbox Code Playgroud) 从一开始我就使用Handler的方法post()并postDelayed()在与UI线程不同的线程中做了一些事情,我决定在其上创建一个TCP Socket,但它不起作用.
我收到了NetworkOnMainThreadException被扔了.
是否有任何方法可以执行post()和postDelayed()不在UI线程中的任务?
public class ServerHandler extends Handler {
private Socket serverSocket;
public ServerHandler(){
super(new MyHandlerThread("MyHandlerThread").getLooper());
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
}
public void connectServer()
{
post(serverConnection);
}
public void writeMessage(String msg){
try {
serverSocket.getOutputStream().write(msg.getBytes());
Log.d("MyLog","Message sent!");
}
catch (IOException io){
Log.d("MyLog","SendMessage error");
}
}
private Runnable serverConnection = new Runnable() {
@Override
public void run() {
try {
serverSocket = new Socket("152.168.21.24", 5001);
Log.d("MyLog","Server connected!"); …Run Code Online (Sandbox Code Playgroud) Handler(android.os.Handler.Callback) 已弃用,我应该使用什么?
Handler handler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(@NonNull Message message) {
switch(message.what) {
case READ_MESSAGE:
byte[] readBuff = (byte[]) message.obj;
String tempMessage = new String(readBuff, 0, message.arg1);
readMsg.setText(tempMessage);
break;
}
return true;
}
});
Run Code Online (Sandbox Code Playgroud) 首先,我知道如何创建Handler。
我正在开发一个项目,我正在Handler使用postDelayed. 有时,应用程序崩溃是因为Activity 被销毁并且处理程序内的任务在 Activity destroy 后执行。
我正在寻找 Handler 的替代方案,它可以在延迟后执行,并且它可以是生命周期感知的,这样应用程序就不会崩溃。
我知道如何取消处理程序(删除处理程序或取消活动的 onDestroy/onStop 方法内的处理程序),这里是相同的链接。但我并不是在寻找这些解决方案。如果可以的话,任何替代方案都将是更好的解决方案。
提前致谢!
我一直想知道使用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
android ×10
android-handler ×10
java ×3
kotlin ×2
alarmmanager ×1
asynchronous ×1
postdelayed ×1
runnable ×1
timertask ×1