标签: android-handler

Android:如何使用Handler handleMessage并访问对MainActivity的引用

我有一个服务,它从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)

问题:

  • Handler需要是静态的吗?没有静态,我得到"这个Handler类应该是静态的,否则可能会发生泄漏"
  • mCamera需要静态吗?我被告知要使mCamera静止,但为什么这是必要的?有没有办法在不使mCamera静态的情况下设置takePicture?
  • 将引用传递给MainActivity的正确方法是什么?现在我收到错误:"在范围内无法访问MainActivity类型的封闭实例"

android android-handler

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

用于重复任务的Android处理程序 - 它会重叠吗?定时器任务VS处理程序VS警报管理器

我正在尝试构建一个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)

java android alarmmanager timertask android-handler

8
推荐指数
2
解决办法
7924
查看次数

Bundle对象的变异

我正在使用遗留代码,我在此函数中发现了一个不一致的行为:

@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)

android asynchronous android-handler android-bundle

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

handler.postDelayed在IntentService的onHandleIntent方法中不起作用

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

7
推荐指数
3
解决办法
6068
查看次数

Oppo F1 中 Handler 的 postDelayed() 延迟结束后 Runnable 未完全执行

在 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)

android runnable kotlin android-handler

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

指定的消息队列同步屏障令牌尚未发布

我有一个作为绑定服务的应用程序。我正在向服务发送消息,但有时会出现以下错误:

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)

android android-handler

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

Android处理程序,不在ui线程中执行post()

从一开始我就使用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)

java multithreading android android-handler

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

Handler(Handler.Callback) 已弃用

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)

java android android-handler

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

如何在 Android 中创建生命周期感知处理程序?

首先,我知道如何创建Handler。

我正在开发一个项目,我正在Handler使用postDelayed. 有时,应用程序崩溃是因为Activity 被销毁并且处理程序内的任务在 Activity destroy 后执行

我正在寻找 Handler 的替代方案,它可以在延迟后执行,并且它可以是生命周期感知的,这样应用程序就不会崩溃。

我知道如何取消处理程序(删除处理程序或取消活动的 onDestroy/onStop 方法内的处理程序),这里是相同的链接。但我并不是在寻找这些解决方案。如果可以的话,任何替代方案都将是更好的解决方案。

提前致谢!

android android-lifecycle kotlin android-handler

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

处理程序或启动协程作业以在主线程中执行某些操作

我一直想知道使用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

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