2014-02-06 92 views
0

我尝试通过使用asynkTask来在后台创建进度条。我是来自服务器的downlroading文件,并通过使用进度条显示文件下载的进度,这工作正常。如何在后台运行进度条?

为了创建这个进度条,我提到了这个link

我的代码:

package com.example.androidhive; 

    import java.io.BufferedInputStream; 
import java.io.File; 
import java.io.FileOutputStream; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.net.URL; 
import java.net.URLConnection; 

import android.app.Activity; 
    import android.app.Dialog; 
import android.app.ProgressDialog; 
import android.graphics.drawable.Drawable; 
import android.os.AsyncTask; 
import android.os.Bundle; 
    import android.os.Environment; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.widget.ImageView; 
import android.widget.ProgressBar; 

public class AndroidDownloadFileByProgressBarActivity extends Activity { 

// button to show progress dialog 
Button btnShowProgress; 

// Progress Dialog 
private ProgressDialog pDialog; 
ImageView my_image; 
// Progress dialog type (0 - for Horizontal progress bar) 
public static final int progress_bar_type = 0; 

String file = Environment.getExternalStorageDirectory()+"/MyAudio"; 
ProgressBar progressBar; 
// File url to download 
private static String file_url = "my url"; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    // show progress bar button 
    btnShowProgress = (Button) findViewById(R.id.btnProgressBar); 
    // Image view to show image after downloading 
    my_image = (ImageView) findViewById(R.id.my_image); 


    File f = new File(file); 
    if (!f.exists()) { 
     f.mkdirs(); 
    } else { 
     // f.delete(); 
    } 
    progressBar = (ProgressBar) findViewById(R.id.progressBar1); 
    /** 
    * Show Progress bar click event 
    * */ 
    btnShowProgress.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // starting new Async Task 
      if (progressBar.getVisibility() != View.VISIBLE) { 
       progressBar.setVisibility(View.VISIBLE); 
      } 
      new DownloadFileFromURL().execute(file_url); 
     } 
    }); 
} 

@Override 
protected void onResume() { 
    // TODO Auto-generated method stub 
    super.onResume(); 
} 

/** 
* Showing Dialog 
* */ 
@Override 
protected Dialog onCreateDialog(int id) { 
    switch (id) { 
    case progress_bar_type: 
     pDialog = new ProgressDialog(this); 
     pDialog.setMessage("Downloading file. Please wait..."); 
     pDialog.setIndeterminate(false); 
     pDialog.setMax(100); 
     pDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
     pDialog.setCancelable(true); 
     pDialog.show(); 
     return pDialog; 
    default: 
     return null; 
    } 
} 

/** 
* Background Async Task to download file 
* */ 
class DownloadFileFromURL extends AsyncTask<String, String, String> { 

    /** 
    * Before starting background thread Show Progress Bar Dialog 
    * */ 
    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     // showDialog(progress_bar_type); 
    } 

    /** 
    * Downloading file in background thread 
    * */ 
    @Override 
    protected String doInBackground(String... f_url) { 
     int count; 
     try { 
      URL url = new URL(f_url[0]); 
      URLConnection conection = url.openConnection(); 
      conection.connect(); 
      // getting file length 
      int lenghtOfFile = conection.getContentLength(); 

      // input stream to read file - with 8k buffer 
      InputStream input = new BufferedInputStream(url.openStream(), 
        8192); 

      // Output stream to write file 
      // OutputStream output = new 
      // FileOutputStream("/sdcard/Audio/downloadedfile.jpg"); 
      OutputStream output = new FileOutputStream(file+ 
        "audio.zip"); 

      byte data[] = new byte[1024]; 

      long total = 0; 

      while ((count = input.read(data)) != -1) { 
       total += count; 
       // publishing the progress.... 
       // After this onProgressUpdate will be called 
       publishProgress("" + (int) ((total * 100)/lenghtOfFile)); 

       // writing data to file 
       output.write(data, 0, count); 
      } 

      // flushing output 
      output.flush(); 

      // closing streams 
      output.close(); 
      input.close(); 

     } catch (Exception e) { 
      Log.e("Error: ", e.getMessage()); 
     } 

     return null; 
    } 

    /** 
    * Updating progress bar 
    * */ 
    protected void onProgressUpdate(String... progress) { 
     // setting progress percentage 
     // pDialog.setProgress(Integer.parseInt(progress[0])); 
     progressBar.setProgress(Integer.parseInt(progress[0])); 
    } 

    /** 
    * After completing background task Dismiss the progress dialog 
    * **/ 
    @Override 
    protected void onPostExecute(String file_url) { 
     // dismiss the dialog after the file was downloaded 
     // dismissDialog(progress_bar_type); 
     if (progressBar.getVisibility() != View.VISIBLE) { 
      progressBar.setVisibility(View.VISIBLE); 
     } 
     // Displaying downloaded image into image view 
     // Reading image path from sdcard 
     String imagePath = Environment.getExternalStorageDirectory() 
       .toString() + "/downloadedfile.jpg"; 
     // setting downloaded into image view 
     // my_image.setImageDrawable(Drawable.createFromPath(imagePath)); 
    } 

} 
    } 

但我的问题是,当我靠近我的应用程序,然后重新打开我的进度条没有显示。 但我的文件在background.I下载我想显示下载文件的进度,如果应用程序将关闭并再次打开它,我想显示下载的进度。

如何我创建这个任何一个请帮我...

回答

0

据我所知,你的所有的UI更新,如你在显示进度条,“死”当你离开你的应用程序。您可以查看活动生命周期here了解更多信息。

您可以尝试使用同步适配器方法(尽管实施起来有点困难)。

请仔细阅读here。在这个来自开发人员文档的例子中,您可以根据自己的需要对其进行调整,即创建一个通知来显示下载的进度,而不是依赖于用户是否离开您的应用程序。