0

我有下载 Image 的 AsyncTask,它还显示进度对话框。asynctask 运行得很好,并且图像下载的进度也正确显示了该值。我通过在 doInBackground() 中记录下载的值来检查它,然后使用 publishProgress()。但是这个 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]);
        }
    }
}

请告诉我哪里做错了。

谢谢,

4

1 回答 1

4

问题是您的进度类型AsyncTask定义为Float,而该onProgressUpdate()方法将Integer作为参数的类型。通过声明onProgressUpdate()这种方式,您将重载标准回调方法,并且不会被AsyncTask. 如果您@Override为此方法添加注释,您的代码也将无法编译。因此,您应该将参数类型更改onProgressUpdate()Float,或者将进度类型更改AsyncTaskInteger,这是一个更好的解决方案,因为ProgressDialog's setProgress()int作为参数类型。

于 2013-04-24T21:19:21.670 回答