我建議您使用AsyncTask
,因爲這是它的目的,而不是試圖自己做。
如果AsyncTask
不是您要查找的內容(例如,下載需要太多時間,您希望讓線程繼續在後臺運行等),並且所有您想要執行的操作都是GUI,你可以在線程上使用runOnUIThread
。
如果以前的解決方案是一個不走,你可以做如下:
public class MainActivity extends Activity {
private void startDownload() {
// Start your thread passing this activity reference for example:
YourThreadStartClass.startThreadedJob(this);
}
public void onDownloadFinish() {
// Do your stuff on MainActivity after the download has finished
}
}
public class YourThreadStartClass {
public static void startThreadedJob(final MainActivity callback) {
new Thread(new YourRunnable(callback)).start();
}
}
// This is the Runnable your thread will be running
public class YourRunnable implements Runnable {
private final MainActivity callback;
public YourRunnable(final MainActivity activity) {
this.callback = activity;
}
@Override
public void run() {
// Do your stuff on this thread and when finished:
this.callback.onDownloadFinish();
}
}
編輯:我已經簡化了一點,但在Java中的實際正確的方式做,這將是定義像
public interface DownloadFinishedCallback {
void onDownloadFinish();
}
的接口,使您MainActivity
(或任何其他類爲此事)實現此接口,並使用DownloadFinishedCallback
引用,而不是一個的一個在YourRunnable
。
實施例與接口:
public interface DownloadFinishedCallback {
void onDownloadFinish();
}
public class MainActivity extends Activity implements DownloadFinishedCallback {
private void startDownload() {
// Start your thread passing this activity reference for example:
YourThreadStartClass.startThreadedJob(this);
}
@Override
public void onDownloadFinish() {
// Do your stuff on MainActivity after the download has finished
}
}
public class YourThreadStartClass {
public static void startThreadedJob(final DownloadFinishedCallback callback) {
new Thread(new YourRunnable(callback));
}
}
// This is the Runnable your thread will be running
public class YourRunnable implements Runnable {
private final DownloadFinishedCallback callback;
public YourRunnable(final DownloadFinishedCallback callback) {
this.callback = callback;
}
@Override
public void run() {
// Do your stuff on this thread and when finished:
this.callback.onDownloadFinish();
}
}
活動不應當積極地與彼此交互。你應該使用一個片段作爲「另一個可以做某事的類」。 – Simas
閱讀關於觀察者模式,這是一個常見的'問題' –
使用asynctask http://developer.android.com/reference/android/os/AsyncTask.html – samleighton87