4

在我的 mainActivity 中,这是我的应用程序的唯一活动,我正在创建下面的处理程序并在其中运行一个可运行文件。

我对处理程序及其运行位置有一些误解。

查看代码

Handler handler;

    @Override
    protected void onCreate(Bundle bundle)
    {
      handler = new Handler();
      handler.postDelayed(r , 5000);
    }

    Runnable r = new Runnable()
    {
         @Override 
         public void run() {
              FetchServerAndUpdateStatus(); //network stuff in here
              handler.postDelayed(r , 5000);
         }
    }
  • 我假设此代码仍将在 UI 线程中运行,并且我将无法在其中进行任何网络调用,不是吗?
  • 如果是,我该怎么办?创建和使用单独的线程?
  • 如果我创建了一个新线程,如何运行 postdelayed 方法?该线程没有延迟发布?
  • 不使用 handler/runnable 而是使用 TimerTask 和 Runnable 是更好的方法吗?或者,就像上面的 handler/runnable 一样,它也将在 UI 线程上运行,除非在单独的线程中创建。
4

2 回答 2

3

当你构造一个 Handler 时,它被绑定到构造它的线程上。

onCreate()在 UI 线程上运行,因此此处理程序将绑定到主线程上的 Looper,因此将在该线程上运行。

如果你想要一个处理程序,你可以在另一个线程上使用,你可以构造一个。请参阅 Looper 文档:https ://developer.android.com/reference/android/os/Looper.html

哪个有这个块:

class LooperThread extends Thread {
  public Handler mHandler;

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

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

      synchronized (this) {
          this.notifyAll();
      }

      Looper.loop();
  }
}

添加此类,然后在您的 onCreate 中执行以下操作:

mLooperThread = new LooperThread();
mLooperThread.start();
synchronized (mLooperThread) {
  while (null == mLooperThread.mHandler) {
    mLooperThread.wait();
  }
}
mLooperThread.mHandler.postDelayed(r , 5000);

这将导致 runnable 不在 UI 线程上运行,这可能是您想要的。

对于需要与 UI 交互的任务,AsyncTask 可能会更好,因为它包含一种机制,当任务在 UI 线程上完成时,它会运行与视图相关的东西,因为任何与视图相关的东西都必须在 UI 线程上完成。

在 UI 线程上执行的其他机制是发布到视图本身:

https://developer.android.com/reference/android/view/View.html#post(java.lang.Runnable) 或 [ https://developer.android.com/reference/android/view/View.html# postDelayed(java.lang.Runnable , long)]( https://developer.android.com/reference/android/view/View.html#postDelayed(java.lang.Runnable , long))

或者要求 Activity 为您在 UI 上运行它:

https://developer.android.com/reference/android/app/Activity.html#runOnUiThread(java.lang.Runnable)

于 2013-09-25T18:20:59.850 回答
0
  1. 这取决于你对处理程序做了什么,你没有显示,你想如何获得 m_handler。如果您使用 创建它new Handler(Looper.getMainLooper()),它将在 UI 线程上运行。
  2. 如果你想在后台运行代码(网络操作)你应该使用AsyncTask
于 2013-09-25T15:22:17.507 回答