我创建IntentService
具有无限循环内的onHandleIntent
然后添加静态方法启动,恢复,暂停内妥善处理顺序线程,停下来直接称它为我的活动范围内。安卓:如何无限循环
这种情况是,在无限循环内,我调用正在创建一个新线程来执行长进程的回调方法。
问题是,我担心由于无限循环而不断创建线程。我很确定有更好的方法来管理它。我正在考虑ThreadPool,或者只能以顺序方式使用一个线程的东西。所以,我节省了时间,内存,开销等。
其他方法非常好。根据需要向我询问其他信息。然后,我会在这里更新。
这里是我的代码(看看SampleCallback):
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 Handler _handler;
public SampleCallbackIntentService(String name) {
super(name);
}
@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 SampleCallback _callback = new SampleCallback() {
@Override
public void doSomethingFromCurrentThread(final Object object) {
new Thread(new Runnable() {
@Override
public void run() {
//do long running process.
// I will access object here.
}
}).start();
}
@Override
public void doSomethingFromUIThread(final Message msg) {
//may update UI here.
}
};
private final int CALLBACK_MESSAGE = 1;
@Override
protected void onHandleIntent(Intent arg0) {
Log.i(LOG_LOGCAT_TAG, "loop started");
while (!_mFinished) {
// do stuff here
// create the object variable. Then pass to callback method
_callback.doSomethingFromCurrentThread(object);
// 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 {
//using sleep here might be not good design.
Thread.sleep(1000);
} catch (InterruptedException e) {
Log.e(LOG_LOGCAT_TAG, "error occured on sleep", e);
}
}
Log.i(LOG_LOGCAT_TAG, "loop ended");
}
private static Object _mPauseLock;
private static boolean _mPaused;
private static boolean _mFinished;
public static void start(Context context) {
Intent service = new Intent(context, SampleCallbackIntentService .class);
if(context.startService(service)==null) {
Log.e(LOG_LOGCAT_TAG, "Service cannot be started");
} else {
Log.i(LOG_LOGCAT_TAG, "start() called");
}
}
/**
* Call this on pause.
*/
public static void pause() {
Log.i(LOG_LOGCAT_TAG, "pause() called");
synchronized (_mPauseLock) {
_mPaused = true;
}
}
/**
* Call this on resume.
*/
public static void resume() {
Log.i(LOG_LOGCAT_TAG, "resume() called");
synchronized (_mPauseLock) {
_mPaused = false;
_mPauseLock.notifyAll();
}
}
public static void stop() {
if(_mPauseLock == null) return;
synchronized (_mPauseLock) {
Log.i(LOG_LOGCAT_TAG, "stop() called");
_mFinished = true;
}
}
}
SampleCallback
import android.os.Message;
public interface SampleCallback {
public void doSomethingFromCurrentThread(final Object object);
public void doSomethingFromUIThread(final Message msg);
}
UPDATES1 我使用的位置API一边F rom google api。我将创建一个android库项目,并使用该api获取后台中的最新位置(例如每2秒)。
在应用程序方面,只需要调用静态方法来使用它(例如启动(背景下,回调),暂停(),恢复(),停止())。它有回调来获取位置。从位置对象获取所需信息后,我将创建一个新线程来调用我自己创建的回调(由应用程序端实现)。
这样做甚至可以吗?在'stop()'你正在使用非静态成员'_mPauseLock'。这甚至有可能吗? –
@Sherif哦谢谢你指出。将其视为已编译的源代码。我会将其改为静态。 – eros
我添加了关于我想实现的信息。 – eros