我創建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