www.91084.com

GVKun编程网logo

android – handler.postDelayed在IntentService的onHandleIntent方法中不起作用(android postdelay原理)

7

在本文中,您将会了解到关于android–handler.postDelayed在IntentService的onHandleIntent方法中不起作用的新资讯,同时我们还将为您解释androidpo

在本文中,您将会了解到关于android – handler.postDelayed在IntentService的onHandleIntent方法中不起作用的新资讯,同时我们还将为您解释android postdelay原理的相关在本文中,我们将带你探索android – handler.postDelayed在IntentService的onHandleIntent方法中不起作用的奥秘,分析android postdelay原理的特点,并给出一些关于@ExceptionHandler在Service类中不起作用、Android Handler.postDelayed()方法、android handler.post和handler.sendMessage的区别和联系、Android HandlerThread 和 IntentService的实用技巧。

本文目录一览:

android – handler.postDelayed在IntentService的onHandleIntent方法中不起作用(android postdelay原理)

android – handler.postDelayed在IntentService的onHandleIntent方法中不起作用(android postdelay原理)

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()中调用的方法也根本不被调用.任何人都可以帮助解释为什么会发生这种情况,我做错了吗?

具有此代码的类扩展了IntentService,这会是一个问题吗?

============================

更新:
我将此代码放在扩展IntentService的类中.我发现它唯一有用的地方是构造函数.但我需要把它放在onHandleIntent方法中.所以我检查了onHandleIntent的文档,它说:

This method is invoked on the worker thread with a request to process.Only one Intent is processed at a time, but the processing happens on a worker thread that runs independently from other application logic. So, if this code takes a long time, it will hold up other requests to the same IntentService, but it will not hold up anything else. When all requests have been handled, the IntentService stops itself, so you should not call stopSelf.

所以基于我得到的结果,我觉得我不能在“工作线程”中使用postDelayed.但是,任何人都可以解释这一点,比如为什么这不适用于工作线程?提前致谢.

解决方法:

您正在使用主线程的looper.您必须创建一个新的循环器,然后将其提供给您的处理程序.

HandlerThread handlerThread = new HandlerThread("background-thread");
handlerThread.start();
final Handler handler = new Handler(handlerThread.getLooper());
handler.postDelayed(new Runnable() {
    @Override public void run() {
        LOG.d("notify!");
        // call some methods here

        // make sure to finish the thread to avoid leaking memory
        handlerThread.quitSafely();
    }
}, 2000);

或者您可以使用Thread.sleep(long millis).

try {
    Thread.sleep(2000);
    // call some methods here

} catch (InterruptedException e) {
    e.printstacktrace();
}

如果要停止休眠线程,请使用yourThread.interrupt();

@ExceptionHandler在Service类中不起作用

@ExceptionHandler在Service类中不起作用

如何解决@ExceptionHandler在Service类中不起作用?

以下是服务类别

@Service
class Test {

    public Object findEmployees1(String id,String dbId) {
        return employeeRepo.findByDatabaseIdAndIdentifier(dbId,id);

    }
    
        public Object findEmployees2(String name,String dbId) {
        Object records = employeeRepo.findByNameAndDatabaseId(name,dbId);

    }
    
    
        @ExceptionHandler(Exception.class)
        public void internalErrorExceptionHandler(Exception ex) {
        LOGGER.error("Log the exception here");
        throw new InternalErrorException(ex.getMessage());
    }
}

我想要在类test中的任何方法中出现任何异常(例如某些sqlException),它会被@ExceptionHandler捕获并记录在那里并重新抛出

我不能将@ExceptionHandler@ControllerAdvice一起使用,因为我没有任何带有@Controller注释的类。我只是在编写一个通用模块以从数据库中获取数据。

执行代码时,@ExceptionHandler下的日志不会被打印,因为它永远不会被调用。 要求是,如果任何服务类方法中有任何异常而没有在每个方法中使用单独的try catch语句,则记录并抛出一个公共异常。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

Android Handler.postDelayed()方法

Android Handler.postDelayed()方法

Android Handler.postDelayed()方法

   1.认识Handler.postDelayed()方法

      为一种实现多线程方法,通过创建一个Handler对象和一个Runnable对象;使用postDelayed()方法

    使之从新调用Runnable对象

 

   ·2,源码

      2.1 创建一个Handler对象:

        Handler handler=new Handler();、

      2.2 然后创建一个Runnable对象;

      Runnable runnable=new Runnable(){
       @Override
        public void run() {
       // TODO Auto-generated method stub
       //想要做的事情
       }
      };         

      2.3 使用postDelayed()方法

        //两秒后调用此Runnable对象

        handler.postDelayed(runnable, 2000);

      2.4 关闭此定时器

        handler.removeCallbacks(runnable);

 

android handler.post和handler.sendMessage的区别和联系

android handler.post和handler.sendMessage的区别和联系

现在大部分人都很熟悉handler这个东西了,我们常用handler的场景无非有两个:

1. 异步更新UI

2. 延时任务

但是我一直有一个困惑,就是handler.post(r)这个方法有什么独特的作用?

通过看源码发现,post这个方法是把任务r转成一个message放进了handler所在的线程中的messageQueue消息队列中,并且是立刻发送的消息,这样它既不是异步的也不是延时的,所以问题来了:

1. 它和sendMessage()有什么区别?

2. 它有什么独特作用呢?

下结论之前我们先通过源码来分析:

/**
   * Causes the Runnable r to be added to the message queue.
   * 这里源码注释的意思是:把r这个任务对象添加到消息队列中。
   */
  public final boolean post(Runnable r)
  {
    return sendMessageDelayed(getPostMessage(r),0);
  }
/**
   * Enqueue a message into the message queue after all pending messages
*然后我们接着看post方法中直接调用到的发送延时消息的方法,源码注释*的意思是把这个消息放入消息队列,
   */
  public final boolean sendMessageDelayed(Message msg,long delayMillis)
  {
    if (delayMillis < 0) {
      delayMillis = 0;
    }
    return sendMessageAtTime(msg,SystemClock.uptimeMillis() + delayMillis);
  }
/*最后我们再看post中调用的另外一个方法,源码中没有注释,但我们很容易看出来,这个方法就是把r这个任务包装成了一个空的消息并且返回*/
private static Message getPostMessage(Runnable r) {
    Message m = Message.obtain();
    m.callback = r;
    return m;
}

至此,我们可以得出结论:

handler.post和handler.sendMessage本质上是没有区别的,都是发送一个消息到消息队列中,而且消息队列和handler都是依赖于同一个线程的。

接下来我们再结合实际应用中的例子来分析:

分别用sendMessage和post完成同样的异步更新UI的任务:

private TextView tv_up;
  private String new_str = "";
  /*post方法解决UI更新问题handler创建方式*/
  private Handler handler_post = new Handler();
  /*sendMessage方法解决UI更新问题handler创建方式*/
  Handler handler_senM = new Handler() {
    public void handleMessage(Message msg) {
      if (msg.what == 1) {
        /*sendMessage方法更新UI的操作必须在handler的handleMessage回调中完成*/
        tv_up.setText(new_str);
      }
    };
  };
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    new Thread(new Runnable() {
      @Override
      public void run() {
        new_str = "更新UI";
        /*sendMessage方法解决UI更新发送消息给handler(主线程中的handler)*/
        handler_senM.sendEmptyMessage(1);
        /*post方法解决UI更新,直接在runnable里面完成更新操作,这个任务会被添加到handler所在线程的消息队列中,即主线程的消息队列中*/
        handler_post.post(new Runnable() {
          @Override
          public void run() {
            tv_up.setText(new_str);
          }
        });
      }
    }).start();
  }

从这段代码中我们可以看出:

post和sendMessage只是用法上的区别,本质是没有区别的。

最终总结:

1. post和sendMessage本质上是没有区别的,只是实际用法中有一点差别

2. post也没有独特的作用,post本质上还是用sendMessage实现的,post只是一中更方便的用法而已

总结

以上所述是小编给大家介绍的android handler.post和handler.sendMessage的区别和联系,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对编程小技巧网站的支持!

Android HandlerThread 和 IntentService

Android HandlerThread 和 IntentService

HandlerThread
HandlerThread 继承了 Thread, 它是一种可以使用 Handler 的 Thread,它实现也很简单,就是在 run 中通过 Looper.prepare () 来创建消息队列,并且通过 Looper.loop () 来开启消息循环,这样再实际使用中就允许在 HandlerThread 中创建 Handle 了。

public class HandlerThread extends Thread {
    int mPriority;
    int mTid = -1;
    Looper mLooper;
    private @Nullable Handler mHandler;

    public HandlerThread(String name) {
        super(name);
        mPriority = Process.THREAD_PRIORITY_DEFAULT;
    }

    public HandlerThread(String name, int priority) {
        super(name);
        mPriority = priority;
    }

    protected void onLooperPrepared() {
    }

    @Override
    public void run() {
        mTid = Process.myTid();
        Looper.prepare();
        synchronized (this) {
            mLooper = Looper.myLooper();
            notifyAll();
        }
        Process.setThreadPriority(mPriority);
        onLooperPrepared();
        Looper.loop();
        mTid = -1;
    }

    public Looper getLooper() {
        //Thread.IsAlive属性 ,表示该线程当前是否为可用状态
        //如果线程已经启动,并且当前没有任何异常的话,则是true,否则为false
        //Start()后,线程不一定能马上启动起来,也许CPU正在忙其他的事情,但迟早是会启动起来的!
        if (!isAlive()) {
            return null;
        }

        // If the thread has been started, wait until the looper has been created.
        synchronized (this) {
            while (isAlive() && mLooper == null) {
                try {
                    wait();
                } catch (InterruptedException e) {
                }
            }
        }
        return mLooper;
    }

    @NonNull
    public Handler getThreadHandler() {
        if (mHandler == null) {
            mHandler = new Handler(getLooper());
        }
        return mHandler;
    }

    public boolean quit() {
        Looper looper = getLooper();
        if (looper != null) {
            looper.quit();
            return true;
        }
        return false;
    }

    public boolean quitSafely() {
        Looper looper = getLooper();
        if (looper != null) {
            looper.quitSafely();
            return true;
        }
        return false;
    }

    public int getThreadId() {
        return mTid;
    }
}

IntentService
IntentService 是一种特殊的 Service,它继承了 Service 并且它是一个抽象类,因此必须创建它的子类才能使用 IntentService
IntentService 可用于执行后台耗时的任务,当任务执行后它会自动停止,同事由于 IntentService 是服务的原因,这导致它的优先级比单纯的线程要高很多,所以 IntentService 比较适合执行一些高级优先级的后台任务,因为它的优先级高不容易被系统杀死。
在实现上,IntentService 封装了 HandlerThread 和 Handler,这一点可以从它的 onCreate 方法中看出来。

public abstract class IntentService extends Service {
    private volatile Looper mServiceLooper;
    private volatile ServiceHandler mServiceHandler;
    private String mName;
    private boolean mRedelivery;

    private final class ServiceHandler extends Handler {
        public ServiceHandler(Looper looper) {
            super(looper);
        }

        @Override
        public void handleMessage(Message msg) {
            onHandleIntent((Intent)msg.obj);
            stopSelf(msg.arg1);
        }
    }

    public IntentService(String name) {
        super();
        mName = name;
    }

    public void setIntentRedelivery(boolean enabled) {
        mRedelivery = enabled;
    }

    @Override
    public void onCreate() {
        // TODO: It would be nice to have an option to hold a partial wakelock
        // during processing, and to have a static startService(Context, Intent)
        // method that would launch the service & hand off a wakelock.

        super.onCreate();
        HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
        thread.start();

        mServiceLooper = thread.getLooper();
        mServiceHandler = new ServiceHandler(mServiceLooper);
    }

    @Override
    public void onStart(@Nullable Intent intent, int startId) {
        Message msg = mServiceHandler.obtainMessage();
        msg.arg1 = startId;
        msg.obj = intent;
        mServiceHandler.sendMessage(msg);
    }

    @Override
    public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
        onStart(intent, startId);
        return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
    }

    @Override
    public void onDestroy() {
        mServiceLooper.quit();
    }

    @Override
    @Nullable
    public IBinder onBind(Intent intent) {
        return null;
    }

    @WorkerThread
    protected abstract void onHandleIntent(@Nullable Intent intent);
}

使用:

class IntentServiceDemo : IntentService("IntentServiceDemo") {
    private val TAG = "zmm"

    /* (non-Javadoc)
     * @see android.app.IntentService#onCreate()
     */
    override fun onCreate() {
        Log.e(TAG, "=>onCreate")
        super.onCreate()
    }

    override fun onStartCommand(@Nullable intent: Intent?, flags: Int, startId: Int): Int {
        Log.e(TAG, "=>onStartCommand")
        return super.onStartCommand(intent, flags, startId)
    }

    /* (non-Javadoc)
         * @see android.app.IntentService#onDestroy()
         */
    override fun onDestroy() {
        Log.e(TAG, "=>onDestroy")
        super.onDestroy()
    }

    override fun onHandleIntent(arg0: Intent?) {
        try {
            Log.e(TAG, "IntentService 线程:" + Thread.currentThread().id)
            Thread.sleep(2000)
        } catch (e: InterruptedException) {
            e.printStackTrace()
        }

    }
}
var mServiceIntent = Intent(this@MainActivity, IntentServiceDemo::class.java)
        startService(mServiceIntent)

 

今天关于android – handler.postDelayed在IntentService的onHandleIntent方法中不起作用android postdelay原理的讲解已经结束,谢谢您的阅读,如果想了解更多关于@ExceptionHandler在Service类中不起作用、Android Handler.postDelayed()方法、android handler.post和handler.sendMessage的区别和联系、Android HandlerThread 和 IntentService的相关知识,请在本站搜索。

本文标签: