【问题标题】:Android: IntentService: How to: pass callback into IntentService from Activity?Android:IntentService:如何:将回调从 Activity 传递给 IntentService?
【发布时间】:2011-08-26 04:21:03
【问题描述】:

我想将回调传递给 IntentService。这是我当前的代码:

我的回调接口

import android.os.Message;

public interface SampleCallback {

    public void doSomethingFromCurrentThread();

    public void doSomethingFromUIThread(final Message msg);
}

我的 IntentService

import android.app.IntentService;
import android.content.Intent;
import android.os.Handler;
import android.os.Message;
import android.util.Log;

public class SampleCallbackIntentService extends IntentService {
    private final String LOG_LOGCAT_TAG = "SampleCallbackIntentService";
    private final SampleCallback _callback;
    private Handler _handler;

    public SampleCallbackIntentService(String name, SampleCallback callback) {
        super(name);
        _callback = callback;
    }

    @Override
    public void onCreate() {
        super.onCreate();

        // initialize variables for pause & resume thread
        _mPauseLock = new Object();
        _mPaused = false;
        _mFinished = false;

        // initialize handler to switch to UI/Main thread
         _handler = new Handler()
            {
                @Override
                public void handleMessage(final Message msg)
                {
                    _callback.doSomethingFromUIThread(msg);
                }
            };
    }

    private final int CALLBACK_MESSAGE = 1;
    @Override
    protected void onHandleIntent(Intent arg0) {
        Log.i(LOG_LOGCAT_TAG, "loop started");
        while (!_mFinished) {
            // do stuff here
            _callback.doSomethingFromCurrentThread();

            // process and create the result to pass
            String someResult = "some result here";
            _handler.sendMessage(_handler.obtainMessage(CALLBACK_MESSAGE, someResult));

            synchronized (_mPauseLock) {
                while (_mPaused) {
                    try {
                        Log.i(LOG_LOGCAT_TAG, "loop paused");
                        _mPauseLock.wait();
                        Log.i(LOG_LOGCAT_TAG, "loop resumed");
                    } catch (InterruptedException e) {
                        Log.e(LOG_LOGCAT_TAG, "error occured on pause", e);
                    }
                }
            }
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                Log.e(LOG_LOGCAT_TAG, "error occured on sleep", e);
            }
        }
        Log.i(LOG_LOGCAT_TAG, "loop ended");
    }

    private Object _mPauseLock;
    private boolean _mPaused;
    private boolean _mFinished;

    /**
     * Call this on pause.
     */
    public void pause() {
        Log.i(LOG_LOGCAT_TAG, "pause() called");
        synchronized (_mPauseLock) {
            _mPaused = true;
        }
    }

    /**
     * Call this on resume.
     */
    public void resume() {
        Log.i(LOG_LOGCAT_TAG, "resume() called");
        synchronized (_mPauseLock) {
            _mPaused = false;
            _mPauseLock.notifyAll();
        }
    }
}

感谢任何有关如何传递我的回调的指导。

【问题讨论】:

  • 我看过这个链接 => stackoverflow.com/questions/3921269/… 但没有明确的答案。为此,我提供了我的源代码。
  • 我的下一个问题是关于如何调用 pause() 和 resume()。我将为此发布另一个问题。问候

标签: android callback


【解决方案1】:

您可能正在寻找ResultReceiver。它实现了 Parcelable,因此您可以将其传递给意图服务。

很抱歉 4 年后给你答复。

【讨论】:

  • 但是当你这样做时要小心,因为你可能会不小心泄露视图。查看video 了解更多信息 尝试使用对活动的弱引用来帮助防止泄漏。
【解决方案2】:

这是一个关于从服务通知活动的好答案:Notify activity from service。至于我,Activity.createPendingResult() 是调用父活动的好方法。

这实际上不是回调,但 AFAIK 没有好的方法可以在没有绑定服务的情况下实现这样的回调。

【讨论】:

  • 如何通过绑定服务实现它?网上有没有实际的例子?如果是的话,你能分享一下网址吗……问候……
  • 哦,我忘了添加我正在谈论的链接。修好了。
  • 我建议不要使用绑定服务。如果你告诉我你想做什么,我会尽量给你一个链接或代码示例。
  • 对于延迟回复,我深表歉意。我正在评估一个名为 Skyhook 的位置 API,它具有回调接口。回调方法将在调用 getLocation(auth, _callback) 时使用。如果成功,将调用 _callback.handleSuccess(location)。如果失败,_callback.handleError(location)。然后,想反复调用Service里面的getLocation。我之前在 Web 应用程序中尝试过 Java,但在阅读 Android 文档后,我意识到这是完全不同的方法,尽管它使用 Java 作为编程语言。问候。
  • 这里有一个很好的教程:mindtherobot.com/blog/37/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多