Если ваша активность хочет остаться на экране, вы можете просто запустить тему, например:
final File fromFile = ...;
final File toFile = ...;
new Thread() {
@Override
public void run() {
// do something with fromFile, toFile
}
}.start();
Таким образом, GUI-поток готов делать другие мысли, например, отображать
android.app.ProgressDialog
Кроме того, рассмотрите возможность отмены диалога с помощью
ProgressDialog.setCancelable(false);
Таким образом, пользователь может выйти только через HOME-ключ, о котором вы получите уведомление, когда
Activity.onPause()
называется. Кроме того, вы можете захотеть заглянуть в Wakelocks, чтобы экран не стал черным, а ваше приложение оказалось в фоновом режиме, где оно может быть убито. Вы бы сделали это в теме:
PowerManager pm = (PowerManager) ivContext.getSystemService(Context.POWER_SERVICE);
Wakelock wakeLock = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "MyApp");
wakeLock.acquire();
// ... copy stuff ...
wakeLock.release();
Конечно, вам также придется разблокировать wakeLock, когда пользователь уходит с помощью HOME-Key.
Наконец, если вы хотите вызывать GUI-Elements из вашего background-thread, это будет работать только в том случае, если Thread является частью GUI-Event-Loop, как обычный поток, в котором вы работаете, когда вас вызывают с помощью on ...- методы. Чтобы добиться этого, ваш фоновый поток должен будет перезвонить в 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);