【问题标题】:Android / Java waiting for handler before returning inside of ServiceAndroid / Java在返回Service内部之前等待处理程序
【发布时间】:2013-09-24 02:16:14
【问题描述】:

我需要使用现有的 API,假设它将直接在 Activity 中的简单应用程序中使用。我的用例需要从 Service 中调用 API 并等待所需的 Handler 返回所需的数据。

我尝试了许多 Java 并发选项,但均未成功。任何人都可以提出更好的方法吗?

下面是一个大大简化的示例,它比实际示例更像是伪代码。

public class dataConnection {

Controlx xControl;
CountDownLatch doneSignal = new CountDownLatch(1);
Context c = null;

private String data1;

Handler mHandler = new Handler() { 
    @Override
    public void handleMessage(Message msg) {
        setReturnData(msg);
        doneSignal.countDown();
    }
};

public dataConnection(Context ctx) { 
    this.c = ctx;
    xControl = new Controlx (c, mHandler);
}       

private void setReturnData(int rc) {
    this.rc = rc;
}

private int getReturnData() {
    return this.rc;
}

public int getRealData() {

    //API will timeout in 10 seconds if data is not retrieved before that
        xControl.dataCmd(10);

    //Wait here for handler to finish and then retrieve data to return
    doneSignal.await(); 

    int i = getReturnData();

    Log.v("log_tag", "RETURN NOW!!!!!!!!!!!!!!!");
    return data;
}

【问题讨论】:

    标签: java android service concurrency handler


    【解决方案1】:

    如果Handler 使用与getRealData() 方法相同的线程,您将阻止它看到MessageLooper 必须完成一件事才能处理任何新事物。

    如果您为处理程序创建一个新线程和循环器,它将允许它们分别运行。根据您的需要,Future<Integer> 对象也可能有用。

    Looper | Android Developers

    Future | Android Developers

    【讨论】:

    • 可以在子线程中创建处理程序然后生成吗?我通过在 getRealData 内部创建一个线程尝试了另一种方法,该线程在一定程度上起作用,但我找不到在 getRealData 返回之前检索数据的合理方法(即使使用 AsyncTask .get 方法)。
    • 是的,looper 页面提供了一个示例类,可以做到这一点。但是,将信息传回可能会有些棘手。一些选项是设置一个同步的静态变量或引用,doneSignal.away() 定期检查,或者让getRealData() 返回一个 void,然后使用主处理程序或返回的intent 之后继续在主线程上工作.如果不指定 doneSignal.away() 究竟做了什么,可能会有很多不同的方法来实现它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-06
    • 2021-11-01
    • 2020-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多