如何处理类在Android中运行(How handler classes work in Andro

2019-07-18 23:53发布

我是新来的Android和正在读关于Android官方网站上的演示应用程序。 我碰到的方法Handler命名为类postDelayed(Runnable r, long milliseconds)

任何人都可以请解释一下这个方法呢?

Answer 1:

你可以看到文档 。

但要明白的文档,你应该先了解几个概念: 消息,消息队列,处理程序和活套 ,和他们的关系 。

下面举例说明尺蠖是如何工作的,这表明弯针是一个线程局部对象及其与的MessageQueue关系:

class Looper{
    public static final void prepare() {
        if (sThreadLocal.get() != null) {
            throw new RuntimeException("Only one Looper may be created per thread");
        }
        sThreadLocal.set(new Looper());
    }

    public static final void loop() {
        Looper me = myLooper();
        MessageQueue queue = me.mQueue;
        while (true) {
            Message msg = queue.next(); // might block
            if (msg != null) {
                if (msg.target == null) {
                    // No target is a magic identifier for the quit message.
                    return;
                }
                msg.target.dispatchMessage(msg);
                msg.recycle();
            }
        }
    }
}

一些言论:

尺蠖是一个线程局部对象以使得每个线程都有一个活套。 每打环器与消息队列相关联。 活套汽车无获得messagese(“任务”,“命令”或任何你喜欢叫他们)从队列中,并分发消息到它的目标,这是一个处理程序来处理messag(例如,通过回拨包含在一个Runnable的消息)。 当没有留在队列中的消息,线程阻塞,直到有新邮件。 要停止尺蠖,你必须调用退出()就可以了(这可能不会立即停止循环,而是设置一个从循环定期检查专用标志,预示着其停止)。

Android框架提供了处理程序类,以简化的东西。 当你创建一个处理程序实例,它是(默认)绑定到已经连接到当前线程的Looper。 (该处理器知道什么活套附加到,因为我们叫准备()前面,其存储在活套在一个ThreadLocal的参考。)

与控制器,你可以叫后()“把消息到线程的消息队列”(这么说)。 该处理器将采取的所有IdleHandler回调的东西照顾,并确保您发布的Runnable执行。 (这也可能检查时间是正确不已,如果您贴有一个延迟。)

下面的代码显示了我们使用它们的典型方式。

class LooperThread extends Thread {
  public Handler mHandler;

  public void run() {
      Looper.prepare();

      mHandler = new Handler() {
          public void handleMessage(Message msg) {
              // process incoming messages here
          }
      };

      Looper.loop();
  }

}

处理器被广泛应用于Android服务。 支持Android应用程序间的通信。 通常,当我们实现服务,并不需要处理多线程,我们实现了接收来自客户端每次调用回调处理程序。 然后创建一个信使的对象(参照处理器),这是一个活页夹对象,当它们结合此服务这个对象返回给客户端。 因此,客户端可以使用这个信使发送消息(进入线程本地队列,通过发送活套到处理器)到这个服务,并让他们在处理程序处理。 代码样品附着:

public class MessengerService extends Service {
    /** Command to the service to display a message */
    static final int MSG_SAY_HELLO = 1;

    /**
     * Handler of incoming messages from clients.
     */
    class IncomingHandler extends Handler {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case MSG_SAY_HELLO:
                    Toast.makeText(getApplicationContext(), "hello!", Toast.LENGTH_SHORT).show();
                    break;
                default:
                    super.handleMessage(msg);
            }
        }
    }


    final Messenger mMessenger = new Messenger(new IncomingHandler());

    @Override
    public IBinder onBind(Intent intent) {
        Toast.makeText(getApplicationContext(), "binding", Toast.LENGTH_SHORT).show();
        return mMessenger.getBinder();
    }
}


Answer 2:

postDelayed (Runnable r, long delayMillis)

使Runnable r要添加到消息队列,经过指定的时间量之后运行。 在runnable将向此处理程序连接线程上运行。

  • 可运行的表示可以执行的命令。

  • delayMillis代表在这之后应执行的时间。

基本上,它延迟命令的的时间(特定期间的执行(一些代码也许) delayMillis ),从而为指定的时间后,以执行该命令。



Answer 3:

public class ApiHandler {

  public static final String BASE_URL = "http://xxx.yyy/xx/";

  private static final long HTTP_TIMEOUT = TimeUnit.SECONDS.toMillis(120);
  private static Webservices apiService;

  public static Webservices getApiService() {

    if (apiService == null) {

        OkHttpClient okHttpClient = new OkHttpClient();
        okHttpClient.setConnectTimeout(HTTP_TIMEOUT, TimeUnit.MILLISECONDS);
        okHttpClient.setWriteTimeout(HTTP_TIMEOUT, TimeUnit.MILLISECONDS);
        okHttpClient.setReadTimeout(HTTP_TIMEOUT, TimeUnit.MILLISECONDS);

        RestAdapter restAdapter = new RestAdapter.Builder()
                .setLogLevel(RestAdapter.LogLevel.FULL)
                .setEndpoint(BASE_URL)
                .setClient(new OkClient(okHttpClient))
                .setConverter(new GsonConverter(new Gson()))
                .build();
        apiService = restAdapter.create(Webservices.class);


        /*RestAdapter.Builder builder = new RestAdapter.Builder();
        builder.setConverter(new StringConverter())
                .setEndpoint(BASE_URL)
                .setClient(new OkClient(new OkHttpClient()))
                .setLogLevel(RestAdapter.LogLevel.NONE);
        RestAdapter adapter = builder.build();

        apiService = adapter.create(Webservices.class);*/

        return apiService;
    } else {
        return apiService;
    }
  }
}


文章来源: How handler classes work in Android