2016-12-05 59 views
1

我想使用android downloadManager從URL下載文件,並使用進度條顯示下載進度。如何在下載時顯示進度條?

XML文件:

<ProgressBar 
         android:id="@+id/progress_bar" 
         android:layout_width="match_parent" 
         android:layout_height="wrap_content" 
         android:layout_margin="10dp" 
         android:layout_alignParentBottom="true" 
         android:progressTint="@color/downloadColorDark" 
         style="@android:style/Widget.Holo.Light.ProgressBar.Horizontal"/> 

下載片段代碼:

Button buttonDownload; 
DownloadManager downloadManager; 
protected ProgressBar mProgressBar; 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 

    View view = inflater.inflate(R.layout.fragment_download, container, false); 
    buttonDownload = (Button)view.findViewById(R.id.downloadMusicButton); 
    buttonDownload.setOnClickListener(new View.OnClickListener(){ 
     @Override 
     public void onClick(View view){ 
      downloadManager = (DownloadManager)getActivity().getSystemService(Context.DOWNLOAD_SERVICE); 
      Uri uri = Uri.parse("http://org3.s1.mp3.zdn.vn/871a49ac2fe8c6b69ff9/6036763354470939079?key=r-YWGIWypTz_FZeaVGri_Q&expires=1480915451&filename=Iridescent%20Linkin%20Park%20Linkin%20Park%20-%20Linkin%20Park.mp3"); 
      DownloadManager.Request request = new DownloadManager.Request(uri); 
      request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); 
      final long downloadId = downloadManager.enqueue(request); 

      mProgressBar = (ProgressBar)view.findViewById(R.id.progress_bar); 
      Timer myTimer = new Timer(); 
      myTimer.schedule(new TimerTask() { 
       @Override 
       public void run() { 
        DownloadManager.Query q = new DownloadManager.Query(); 
        q.setFilterById(downloadId); 
        Cursor cursor = downloadManager.query(q); 
        cursor.moveToFirst(); 
        int bytes_downloaded = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR)); 
        int bytes_total = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES)); 
        cursor.close(); 
        final int dl_progress = (bytes_downloaded * 100/bytes_total); 
        getActivity().runOnUiThread(new Runnable(){ 
         @Override 
         public void run(){ 
          mProgressBar.setProgress(dl_progress); 
         } 
        }); 

       } 

      }, 0, 10); 
     } 
    }); 

    return view; 
} 

下載功能完美的作品,但在我添加的代碼進度條,應用程序崩潰時,我按下下載按鈕。請告訴我我做錯了什麼。

錯誤消息:

E/AndroidRuntime: FATAL EXCEPTION: main 
       Process: vn.edu.usth.musicplayer, PID: 4456 
       java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ProgressBar.setProgress(int)' on a null object reference 
        at vn.edu.usth.musicplayer.fragment.DownloadFragment$1$1$1.run(DownloadFragment.java:73) 
        at android.os.Handler.handleCallback(Handler.java:751) 
        at android.os.Handler.dispatchMessage(Handler.java:95) 
        at android.os.Looper.loop(Looper.java:154) 
        at android.app.ActivityThread.main(ActivityThread.java:6119) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 
+0

安置自己的錯誤細節 – Mushirih

+0

對不起,我忘了發佈錯誤消息。更新。 – Marco

回答

2

,如果你使用AsyncTask實現ProgressDialog這將是您輕鬆。 使用下面的代碼來實現進度條。

private class DownloadTask extends AsyncTask<String, Integer, Void> { 

     ProgressDialog dialog = new ProgressDialog(MainActivity.this); 

     @Override 
     protected void onPreExecute() { 
      //set message of the dialog 
      dialog.setMessage("Loading..."); 
      //show dialog 
      dialog.show(); 
      super.onPreExecute(); 
     } 

     protected Void doInBackground(String... args) { 
      // do background work here 
      return null; 
     } 

     @Override 
     protected void onProgressUpdate(Integer... values) { 
      // Update download Progress 
      super.onProgressUpdate(values); 
     } 

     protected void onPostExecute(List<Transaction> result) { 
     // do UI work here 
     if(dialog != null && dialog.isShowing()){ 
      dialog.dismiss() 
     } 
     } 
    } 
2

看來你有兩個變量稱爲視圖....查看視圖= inflater.inflate(R.layout.fragment_download,容器,FALSE);和@覆蓋 公共無效的onClick(查看視圖){你能不能重命名 變化有鑑於此變量:

Button buttonDownload; 
DownloadManager downloadManager; 
protected ProgressBar mProgressBar; 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 

    View view2 = inflater.inflate(R.layout.fragment_download, container, false); 
    buttonDownload = (Button)view2.findViewById(R.id.downloadMusicButton); 
    buttonDownload.setOnClickListener(new View.OnClickListener(){ 
     @Override 
     public void onClick(View view){ 
      downloadManager = (DownloadManager)getActivity().getSystemService(Context.DOWNLOAD_SERVICE); 
      Uri uri = Uri.parse("http://org3.s1.mp3.zdn.vn/871a49ac2fe8c6b69ff9/6036763354470939079?key=r-YWGIWypTz_FZeaVGri_Q&expires=1480915451&filename=Iridescent%20Linkin%20Park%20Linkin%20Park%20-%20Linkin%20Park.mp3"); 
      DownloadManager.Request request = new DownloadManager.Request(uri); 
      request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); 
      final long downloadId = downloadManager.enqueue(request); 

      mProgressBar = (ProgressBar)view2.findViewById(R.id.progress_bar); 
      Timer myTimer = new Timer(); 
      myTimer.schedule(new TimerTask() { 
       @Override 
       public void run() { 
        DownloadManager.Query q = new DownloadManager.Query(); 
        q.setFilterById(downloadId); 
        Cursor cursor = downloadManager.query(q); 
        cursor.moveToFirst(); 
        int bytes_downloaded = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR)); 
        int bytes_total = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES)); 
        cursor.close(); 
        final int dl_progress = (bytes_downloaded * 100/bytes_total); 
        getActivity().runOnUiThread(new Runnable(){ 
         @Override 
         public void run(){ 
          mProgressBar.setProgress(dl_progress); 
         } 
        }); 

       } 

      }, 0, 10); 
     } 
    }); 

    return view2; 
}