2013-04-24 2 views
0

У меня AsyncTask, который загружает изображение, а также показывает диалог прогресса. Асинхронная программа работает очень хорошо, и прогресс загрузки изображения также показывает значение правильно. Я проверил его, зарегистрировав значение загрузки в doInBackground(), а затем использовал publishProgress(). Но этот publishProgress не увеличит bar progressdialog.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

+0

Да pValue рассчитывается по желанию. и показано, как следует в окне просмотра LogCat Скачать до сих пор: 99,0 Скачать до сих пор: 99,0 Скачать до сих пор: 100,0 И я также попробовал уже pDialog.setProgress (значения [0]); Но все же диалог прогресса не будет увеличиваться. Есть ли что-то, что я могу потерять. – Samundra

ответ

4

Дело в том, что тип прогресс вашего AsyncTask определяется как Float, в то время как метод onProgressUpdate() принимает Integer в качестве типа параметров. Объявив onProgressUpdate() таким образом, вы перегружаете стандартный метод обратного вызова, и он не будет вызываться AsyncTask. Ваш код также не скомпилируется, если вы добавите аннотацию @Override к этому методу. Поэтому вы должны либо изменить тип аргумента onProgressUpdate() на Float, либо изменить тип выполнения AsyncTask на Integer, что лучше решить с ProgressDialog'ssetProgress() принимает int в качестве типа аргумента.

+0

Спасибо, ваше решение сработало. Я изменил параметр на Integer и добавил аннотацию @Override. – Samundra

+0

@ Самундра, Добро пожаловать, рад, что это сработало. – Egor

Смежные вопросы