Android技术知识Android开发Android开发经验谈

Android 在使用接口回调时调用 Thread.Sleep(

2018-07-15  本文已影响29人  d74f37143a31

写这篇文章的原因

原本只是想用最简单最容易理解的方式去介绍在 Android 中如何使用接口回调机制。刚开始我也觉得接口回调也很朦胧,只知道是为了处理任务异步,以及能使代码看起来更加容易理解和维护,但是如何去实现还不太清楚。

通过看了其他大神的博客,终于能用自己的方式去理解接口回调如何实现,于是想着花十几分钟整理出一个小例子,也让不太理解该机制的人,能够快速理解。

但是真正写起来,才发现很多东西都我都没理解好,所以在这里将这次的事件做个记录。

接口回调简单理解和实现

接口回调的使用场景

在 A 类中调用 B 类中的方法,在该方法处理完成后需要将结果告知 A 类即可用接口回调实现

例如在 TestCallBackActivity 中有个按钮,通过点击这个按钮可以去做一些事情,比如我想通过点击这个按钮,让 Wang.class 这个类里面的 dowork() 方法去做一些事情,当Wang.class做完了事情之后需要通知 TestCallBackActivity它做完了。

通俗易懂的理解

下面一段是吐槽,可以跳过!!
又或者是今天老板S给了一个需求给程序员A,让程序员去做,不管程序员A怎么做,程序员A只要在完成任务后将成品给老板看就行(一般情况下不可能当场就做出来,需要一定的时间,所以老板这时候就可以去给其他程序员提其他需求或者是去喝杯咖啡??又或者在你旁边一直等着你做出来,但是谁知道你什么时候做出来,哈哈哈)

实现

public interface ICallBack {
    void aBiggerThanb() ;
    void aSmallThanb() ;
}

public class Wang {
   public void doWork(int a, int b, ICallBack callBack){
       if (a > b){
           callBack.aBiggerThanb();
       }else {
           callBack.aSmallThanb();
       }
   }
}
Button btnCallWangToWork = findViewById(R.id.btn_call_wang_to_work) ;
final Wang wang = new Wang();

btnCallWangToWork.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Toast.makeText(CallBackTestActivity.this, "小王正在计算中...", Toast.LENGTH_SHORT).show();

        wang.doWork(10, 50, new ICallBack() {
            @Override
            public void aBiggerThanb() {
                new Timer().schedule(new TimerTask() {
                    @Override
                    public void run() {
                        Looper.prepare();
                        Toast.makeText(CallBackTestActivity.this, "a > b", Toast.LENGTH_SHORT).show();
                        Looper.loop();
                    }
                }, 4 * 1000);
            }

            @Override
            public void aSmallThanb() {
                try {
                    Thread.sleep(500);
                    Toast.makeText(CallBackTestActivity.this, "a < b", Toast.LENGTH_SHORT).show();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
    }
});

一些问题

Thread.Sleep的表示的含义我们可以点击进入方法查看到方法描述:

Causes the currently executing thread to sleep
 (temporarily cease execution) for the specified number 
 of milliseconds, subject to the precision 
 and accuracy of system timers and schedulers.
  The thread does not lose ownership of any monitors

主要是说Sleep方法会让当前线程休眠指定的毫秒数,目标对象服从系统的时间和调度。从该描述中结合 Toast 默认的显示时长我们可以知道是什么原因导致Toast不弹出了。

Looper.prepare();
....doSomething...
Looper.loop();

OK ,收工!

上一篇 下一篇

猜你喜欢

热点阅读