如果您的 Activity 想要留在屏幕上,您可以像这样简单地启动一个线程:
final File fromFile = ...;
final File toFile = ...;
new Thread() {
@Override
public void run() {
// do something with fromFile, toFile
}
}.start();
这样 GUI-Thread 就可以做其他的事情了,比如显示一个
android.app.ProgressDialog
另外,考虑使对话框无法取消
ProgressDialog.setCancelable(false);
这样,用户只能通过 HOME 键离开,您会在何时收到通知
Activity.onPause()
叫做。此外,您可能想要查看 Wakelocks,以阻止屏幕变黑,并将您的应用程序推到可能被杀死的后台。您可以在 Thread 中执行此操作:
PowerManager pm = (PowerManager) ivContext.getSystemService(Context.POWER_SERVICE);
Wakelock wakeLock = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "MyApp");
wakeLock.acquire();
// ... copy stuff ...
wakeLock.release();
当然,当用户通过 HOME 键离开时,您也必须释放 wakeLock。
最后,如果您想从后台线程调用 GUI-Elements,这仅在线程是 GUI-Event-Loop 的一部分时才有效,就像您正在运行的普通线程一样,当被调用时... -方法。为了实现这一点,您的后台线程必须通过处理程序回调到 GUI 线程。像这样:
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
Log.v(TAG, "Got Message "+msg.what); // prints: Got Message 77
// ... do GUI actions ...
}
};
// ... in Thread ...
int lvInfo = 77;
mHandler.sendEmptyMessage(lvInfo);
您甚至可以像这样将对象放入消息中:
Message txtMsg = Message.obtain();
textMsg.obj = "Hello World";
mHandler.sendMessage(lvTextMsg);