2013-04-24 110 views
0

我有AsyncTask下载图像,它也显示进度对话框。 asynctask运行非常好,并且图像下载的进度也正确显示了值。我通过在doInBackground()中记录下载的值来检查它,然后使用publishProgress()。但是这个publishProgress不会增加bar进度对话框。Asynctask不更新进度对话框publishprogress

以下是我正在使用的代码。

public class SingleMenuItemActivity extends Activity { 
public static final String KEY_TITLE = "title"; 
public static final String KEY_LINK = "link"; 
public static final String KEY_DATE = "date"; 

public static final String TAG = "SingleMenuItemActivity"; 
private ProgressDialog pDialog; 
// Progress dialog type (0 - for Horizontal progress bar) 
public static final int PROGRESS_BAR_TYPE = 0; 

//public static ImageDownloadTask imTask; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.single_list_item); 

    // getting intent data 
    Intent in = getIntent(); 

    // Get XML values from previous intent 
    String name = in.getStringExtra(KEY_TITLE); 
    String pLink = in.getStringExtra(KEY_LINK); 
    String pDate = in.getStringExtra(KEY_DATE); 

    // Displaying all values on the screen 
    TextView lblTitle = (TextView) findViewById(R.id.title_label); 
    TextView lblDate = (TextView) findViewById(R.id.publish_label); 
    lblTitle.setText(name); 
    lblDate.setText(pDate); 

// Set Image 
    try { 
     URL url = new URL(pLink); 
     new ImageDownloadTask().execute(url); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

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

class ImageDownloadTask extends AsyncTask<URL, Float, String> { 

    public static final String TAG = "ImageDownloadTask";   
    ImageView imageView = (ImageView) findViewById(R.id.single_list_imageview); 
    int count; 
    @Override 
    protected String doInBackground(URL... params) { 
     try { 

       URL url = params[0]; 
       URLConnection conection = url.openConnection(); 
       conection.connect(); 
       // this will be useful so that you can show a tipical 0-100% progress bar 
       int lenghtOfFile = conection.getContentLength(); 

       // download the file 
       InputStream input = new BufferedInputStream(url.openStream(), 8192); 

       // Output stream 
       OutputStream output = new FileOutputStream("/sdcard/downloadedfile.jpg"); 

       byte data[] = new byte[1024]; 

       long total = 0; 

       while ((count = input.read(data)) != -1) { 
        total += count; 
        float pValue = (float)((total*100)/lenghtOfFile); 
        Log.d(TAG,"Download so far : "+pValue); 
        // publishing the progress.... 
        // After this onProgressUpdate will be called 
        publishProgress(pValue); 

        // 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; 
    } 


    @Override 
    protected void onPostExecute(String result) { 

     Log.d(TAG,"Bitmap download complete"); 
     dismissDialog(PROGRESS_BAR_TYPE); 

     // Displaying downloaded image into image view 
     // Reading image path from sdcard 
     String imagePath = Environment.getExternalStorageDirectory().toString() + "/downloadedfile.jpg"; 
     // setting downloaded into image view 
     imageView.setImageDrawable(Drawable.createFromPath(imagePath)); 
    } 

    @Override 
    protected void onCancelled(){ 
     Log.d(TAG,"Progress Dialog was Cancelled"); 
     pDialog.dismiss(); 
    } 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     // Things to be done before execution of long running operation. For 
     // example showing ProgessDialog 
     showDialog(PROGRESS_BAR_TYPE); 
    } 

    protected void onProgressUpdate(Integer... values) { 
     //super.onProgressUpdate(values); 
     Log.d(TAG,"values"+values[0]); 
//   incrementProgressBy(values[0]); 
     //pDialog.setProgress(values[0]); 
     setProgress(values[0]); 
     } 
    } 
} 

请告诉我我在哪里做错了。

谢谢

+0

你应该在对话框本身上调用setProgress(),顺便说一句,你确定你正在计算正确的进度? – Egor 2013-04-24 21:05:51

+0

是的,pValue按照需要进行计算。并示出为在迄今为止的logcat视图 下载如下:99.0 下载到目前为止:99.0 下载到目前为止:100.0 我也曾尝试已经 pDialog.setProgress(值[0]); 但是,进度对话框仍然不会增加。有什么我可能会失踪。 – Samundra 2013-04-24 21:09:36

回答

4

的事情是,你AsyncTask进度类型定义为Float,而onProgressUpdate()方法需要Integer为参数的类型。通过这种方式声明onProgressUpdate(),您将超负载标准回调方法,并且不会被AsyncTask调用。如果您将@Override注释添加到此方法,您的代码也将无法编译。因此,您应该将参数类型onProgressUpdate()更改为Float,或者将进度类型AsyncTask更改为Integer,这是更好的解决方案,因为ProgressDialog'ssetProgress()需要将int作为参数类型。

+0

谢谢,你的解决方案工作。我将参数更改为Integer并添加了@Override注释。 – Samundra 2013-04-24 21:25:19

+0

@Samundra,不客气,很高兴它的工作。 – Egor 2013-04-25 05:52:47