2016-04-13 9 views
-3

Obwohl ich viele Referenzen online überprüft habe, kann ich das Problem immer noch nicht finden. Es scheint die ProgressDialog scheint in Ordnung, aber immer wenn ich den Fortschritt aktualisieren möchten, in onProgressUpdate seine Instanz ist immer Null.ProgressDialog in AsyncTask zeigt keinen Fortschritt

Das ist mein AsyncTask:

package com.async_tasks; 

public class UploadTask extends AsyncTask<Void,Integer,Void> implements Serializable {   
    private static final String TAG = UploadTask.class.getSimpleName(); 
    private ConnectionToServer _connectionToServer; 
    private TransferDetails _td; 
    private Activity _activity; 
    private ProgressDialog _progDialog; 
    private UploadTask _taskInstance; 

    public UploadTask(Activity activity, ConnectionToServer connectionToServer, TransferDetails td) { 

     _activity = activity; 
     _connectionToServer = connectionToServer; 
     _td = td; 
     _taskInstance = this; 
    } 

    @Override 
    protected void onPreExecute() { 

     _progDialog = new ProgressDialog(_activity); 
     String cancel = _context.getResources().getString(R.string.cancel); 

     _progDialog.setCancelable(false); 
     _progDialog.setTitle(_context.getResources().getString(R.string.uploading)); 
     _progDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
     _progDialog.setProgress(0); 
     _progDialog.setMax(100); 
     _progDialog.setButton(DialogInterface.BUTTON_NEGATIVE, cancel, new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 

       _taskInstance.cancel(true); 
      } 
     }); 

     _progDialog.show(); 

    } 

    @Override 
    protected Void doInBackground(Void... voids) { 

     //uploading file ... 
       float percent = (float) (fileSize - bytesToRead)/fileSize * 100; 
       publishProgress((int)percent);     
      } 

     } 
     catch (IOException e) { 
       // Handling exception 
     } finally { 

      if(bis!=null) { 
       try { 
        bis.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
      clearMembers(); 

      } 
     } 

     return null; 
    } 

    @Override 
    protected void onProgressUpdate(Integer... progress) { 

     if(_progDialog!=null) { // <<------------ I suspect for some reason this is always false, as _progDialog is always null - But why?! 
      _progDialog.incrementProgressBy(progress[0]); 
     } 
    } 

    @Override 
    protected void onPostExecute(Void result) { 

     //The task is complete, clear members 
     clearMembers(); 
    } 

    private void clearMembers() { 

     _activity = null; 
     if(_progDialog!=null) { 
      _progDialog.dismiss(); 
      _progDialog = null; 
     } 
    } 
} 

Und das ist der Anruf von MainActivity:

TransferDetails td = (TransferDetails) report.data(); 
ConnectionToServer conn = StorageServerProxyService.getConn(); 
UploadTask uploadTask = new UploadTask(MainActivity.this, conn, td); 
uploadTask.execute(); 
+0

Dies ist kein ist Duplikat von http://stackoverflow.com/questions/4538338/progressdialog-in-asynctask da es dort keine Erwähnung gibt o f versucht mit progressDialog innerhalb der Hook-Methode onProgressUpdate zu arbeiten. Dies ist die problematische Methode für mich, in der ich einen NULL-Verweis auf den progressDialog bekomme, egal was ich versuchte ... – Nom1fan

Antwort

0

die OnPreExecute ändern() -Methode wie folgt:

@Override 
    protected void onPreExecute() { 

progDialog = new ProgressDialog(ActivityName.this); 
     String cancel = _context.getResources().getString(R.string.cancel); 

     _progDialog.setCancelable(false); 
     _progDialog.setTitle(_context.getResources().getString(R.string.uploading)); 
     _progDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
     _progDialog.setProgress(0); 
     _progDialog.setMax(100); 
     _progDialog.setButton(DialogInterface.BUTTON_NEGATIVE, cancel, new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 

       _taskInstance.cancel(true); 
      } 
     }); 

     _progDialog.show(); 

    } 
+0

Diese AsyncTask befindet sich nicht innerhalb der MainActivity, sondern in einer separaten Klasse, daher ist MainActivity.this hier nicht möglich. Ich habe versucht, den Activity-Kontext mit dem Setter zu übergeben und dann die Instantiierung in onPreExecute wie vorgeschlagen auszuführen, aber es hat mein Problem immer noch nicht gelöst. Was kann ich noch tun, wenn meine AsyncTask in einer separaten Klasse ist? – Nom1fan

+0

Ändern Sie den Kontext zu Aktivität in Setter-Methode und ändern Sie auch den Typ von this._context zu Aktivität dann versuchen Sie es mich wissen –

+0

Ok Ich werde es versuchen und aktualisieren Sie. Vielen Dank für den Versuch, mir zu helfen und nicht nur -1 zu geben, ohne etwas anderes zu sagen :) – Nom1fan