Я создал небольшое приложение, которое загружает файл с помощью диспетчера загрузки.
Все в порядке.
Я думал добавить небольшой Toast
и показать пользователю текущий статус загрузки.
Так что я сделал что-то вроде следующего:Почему Тост не скрыт после окончания периода?
Thread t = new Thread(new Runnable() {
@Override
public void run() {
int status = -1;
while ((status = checkDownloadStatus()) != -1 && status != DownloadManager.STATUS_FAILED && status != DownloadManager.STATUS_SUCCESSFUL) {
try {
Log.d("MyApp", "Sleeping for 500 while polling for status [ " + status + " ]");
TimeUnit.MILLISECONDS.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
Log.e("MyApp", e.getLocalizedMessage());
}
}
Log.d("MyApp", "Stop sleeping!");
}
});
t.start();
Внутри checkDownloadStatus
я показать Toast
пользователю о состоянии загрузки: например, НАЧАТЬ/ОЖИДАНИЕ/ЗАВЕРШЕНА
Я вижу, что загрузка продолжается, и я вижу Toast
во время загрузки и в журналах, которые я вижу:
Sleeping for 500 while polling for status [ 2 ]
Sleeping for 500 while polling for status [ 2 ]
Sleeping for 500 while polling for status [ 2 ]
Sleeping for 500 while polling for status [ 2 ]
…..
Затем, когда загрузка будет завершена, я вижу в журнале :
Stop sleeping!
Но Toast
с последним сообщ по-прежнему отображается.
Что я делаю неправильно? Есть ли лучший способ добиться того, что мне нужно
UPDATE:
private int checkDownloadStatus() {
final Cursor c= dm.query(new DownloadManager.Query().setFilterById(downloadId));
if (c == null) {
showUserStatus(getActivity().getString(R.string.download_not_found), Toast.LENGTH_LONG);
}
else {
c.moveToFirst();
final int status = showStatusMessage(c);
c.close();
return status;
}
return -1;
}
private int showStatusMessage(Cursor c) {
String msg="???";
int downloadStatus = c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS));
switch (downloadStatus) {
case DownloadManager.STATUS_FAILED:
msg= getActivity().getString(R.string.download_failed);
break;
case DownloadManager.STATUS_PAUSED:
msg= getActivity().getString(R.string.download_paused);
break;
case DownloadManager.STATUS_PENDING:
msg= getActivity().getString(R.string.download_pending);
break;
case DownloadManager.STATUS_RUNNING:
msg= getActivity().getString(R.string.download_in_progress);
break;
case DownloadManager.STATUS_SUCCESSFUL:
msg= getActivity().getString(R.string.download_complete);
break;
default:
msg= getActivity().getString(R.string.download_is_nowhere_in_sight);
break;
}
showUserStatus(msg, Toast.LENGTH_LONG);
return downloadStatus;
}
private void showUserStatus(final String msg, final int length) {
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getActivity(), msg, length).show();
}
});
}
пост checkDownloadStatus() – Blackbelt
@Blackbelt: Пожалуйста, смотрите обновления в OP – Jim
I подумайте, что вам нужно попробовать «LENGTH_SHORT» вместо «LENGTH_LONG». –