【问题标题】:Android Main Thread Looper concernAndroid 主线程 Looper 关注
【发布时间】:2013-09-17 04:33:58
【问题描述】:

我正在编写一个库,它执行一些密集的网络工作。所以,我使用 HandlerThread 来执行这个操作,如下所示:

Looper.prepare();
libraryThread = new LibraryHandlerThread(context);
libraryThread.start();
libraryThread.getLooper();

LibraryHandlerThread 执行网络操作和其他耗时操作。

当我从工作线程(主线程以外的任何线程)调用此代码时,它工作正常。但是抱怨“当一个已经处于活动状态的循环器时无法初始化另一个循环器”。我相信 Looper 默认在主线程上运行,并抱怨 Looper.prepare()。我可以执行以下操作以使其在主线程中工作:

Looper.getMainLooper().quit();
Looper.prepare();
libraryThread = new LibraryHandlerThread(context);
libraryThread.start();
libraryThread.getLooper();

我的问题是:对主线程有什么影响。在我的理想世界中,我想在不影响主线程的情况下在单独的线程上运行我的库操作。我怎样才能在不造成太大破坏的情况下实现这一目标?

【问题讨论】:

    标签: java android multithreading thread-safety looper


    【解决方案1】:

    您需要研究的是使用 Asynctask 在后台运行它,这将使您的主线程继续工作http://developer.android.com/reference/android/os/AsyncTask.html

    或者,如果这是您需要不断运行的服务,您可以创建一个服务。 http://developer.android.com/reference/android/app/Service.html

    【讨论】:

    • 引用您分享的链接:“AsyncTasks 最好用于短时间的操作(最多几秒钟。)”
    • 好点!这就提出了一个问题,在这种情况下什么是广泛的。如果我们知道正在完成什么样的工作,最佳选择就会变得显而易见。 Nitin Sethi 我确实认为您在这种情况下很可能是正确的。
    • 至于第二段,重要的是要记住,使用服务并不意味着使用不同的线程,除非服务将工作传递给它明确创建的某个内部线程。
    【解决方案2】:

    试试下面的代码:

    private static final HandlerThread sWorkerThread = new HandlerThread("network-operations");
    static {
        sWorkerThread.start();
    }
    private static final Handler sWorker = new Handler(sWorkerThread.getLooper());
    

    【讨论】:

    • 如果处理程序是以这种方式创建的,我该如何定义 handleMessage() 方法/行为?
    • 您可以在包含上述代码的类的构造函数中传递您的Activity的引用,并使用它来调用Activity类中的实例方法。您可以在链接中查看来自 AOSP 的 LauncherModel 类:grepcode.com/file/repository.grepcode.com/java/ext/…
    猜你喜欢
    • 2014-04-19
    • 2014-10-03
    • 1970-01-01
    • 2023-03-30
    • 2013-11-15
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    • 2012-02-04
    相关资源
    最近更新 更多