2

我創建了一個使用下載管理器下載文件的小應用程序。
目前爲止都可以。
我想添加一個小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! 

但仍然顯示帶有最後一個msg的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(); 
      } 
     }); 
    } 
+0

後checkDownloadStatus() – Blackbelt

+0

@Blackbelt後運行:請參見OP – Jim

+0

我更新認爲你必須嘗試'LENGTH_SHORT'而不是'LENGTH_LONG'。 –

回答

1

Toast are queued。如果您使用相同的文本調用showText n次,則會在n *長度時間內看到相同文本的烤麪包。保留對當前Toast的引用並在顯示下一個之前調用Toast.cancel()。

E.g.

Toast mToast; 

private void showUserStatus(final String msg, final int length) { 
     getActivity().runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       if (mToast != null) { 
        mToast.cancel(); 
       } 
       mToast = Toast.makeText(getActivity(), msg, length); 
       mToast.show(); 
      } 
     }); 
    } 
+0

這解決了它謝謝你,但我不清楚的行爲。 「吐司在排隊等着什麼?」? – Jim

+0

他們真的被放在一個內部隊列中,並一個接一個地顯示。取消立即刪除當前的一個 – Blackbelt

0

看,你在呼喚checkDownloadStatus在while循環條件()方法,所以它會被再次調用又一次,直到條件將不會滿足。這就是吐司一次又一次顯示的原因。 Toast將在隱藏最後顯示之前再次顯示,所以它看起來像顯示很長時間。(對不起英語不好)

+0

條件確實滿足一旦下載完成,這就是爲什麼我達到'Log.d(「MyApp」,「停止睡眠!」); ** **外部**的循環 – Jim

1

不使用while循環對於這一點,使用定時器來代替

 Timer mtimer = new Timer(); 
     mtimer.schedule (new TimerTask() { 
      @Override 
      public void run() { 
       if((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()); 
        } 
       } 

      } 
     }, 0, 1000); 

這將每1秒

+0

如何滿足條件後停止重新計劃? – Jim

+0

mtimer.cancel(); –

+0

在runnable裏面? – Jim