2

Unten ist mein Code mein versucht, meine Fortschritte in Asyntask über OnProgressUpdate -Methode anzuzeigen, aber es wird nicht in der Alarm-Diaalog angezeigt. Nur die erste Nachricht wird angezeigt.AlertDialog SetMessage funktioniert nicht in Asynctask

class DownloadFileFromURL extends AsyncTask<String, String, String> { 

     private AlertDialog.Builder alert; 
     private int progress = 0; 
     /** 
     * Before starting background thread Show Progress Bar Dialog 
     */ 
     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      alert = new AlertDialog.Builder(context); 
      alert.setTitle("Downloading.."); 
      alert.setMessage("1"); 
      alert.setCancelable(false); 
      alert.show(); 
     } 

     /** 
     * 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(); 

       // 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(file); 

       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 
     */ 
     @Override 
     protected void onProgressUpdate(String... progress) { 
      Log.d("Myapp","progress :"+progress[0]); 
      alert.setMessage(""+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 
} 
} 

Da ich auch ein Protokoll zeigen den aktuellen Stand in onProgressUpdate geschrieben haben, wird das Protokoll gedruckt, aber die alert.setMessage in onProgressUpdate gesetzt scheint nicht um die Nachricht zu meinen Alarm-Dialog.

+0

zu schaffen habe ich denke, es wird besser, wenn Sie ProgressDialog anstelle von Alertdialog. – alway5dotcom

+0

verwenden Sie setmessage nicht auf alertdialog, sondern Builder. und wie wäre es, ersetzen Sie den mittleren Argumenttyp String mit Integer? – iroiroys

+0

@iroirys Ja, ich habe das falsch gemacht, weil ich dachte, es würde so funktionieren, und ja, ich habe den mittleren Argumenttyp auf Integer geändert. Danke .. !! –

Antwort

5

Gemäß Ihrem Code ist alert ein AlertDialog.Builder und kein AlertDialog selbst. Dies hat mich beunruhigt, weil der Grund, warum es sich nicht ändern könnte, darin liegt, dass Sie den Builder bereits gezeigt haben, aber nicht an einen AlertDialog geben. Also habe ich versucht, einen einfachen Code aus:

public class MainActivity extends AppCompatActivity { 

    private AlertDialog.Builder alert; 
    private AlertDialog ad; 

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

     alert = new AlertDialog.Builder(this); 
     alert.setTitle("Downloading.."); 
     alert.setMessage("1"); 
     alert.setCancelable(false); 
     ad = alert.show(); 


     Log.d("SAMPLE", "SET MESSAGE 2"); 
     alert.setMessage("2"); 

     Log.d("SAMPLE", "SET MESSAGE 3"); 
     ad.setMessage("3"); 
    } 

} 

Zuerst habe ich nur die alert.setMessage (dies ist die AlertDialog.Builder), und die Nachricht nicht überhaupt ändern. Aber nachdem Sie es in eine AlertDialog setzen und dann die Nachricht der AlertDialog Instanz setzen, änderte sich die Nachricht. Sorge dafür, diesen Ansatz auszuprobieren. Übergeben Sie die AlertDialog.Builder an eine AlertDialog zuerst, dann setMessage mit der AlertDialog Instanz.

Dokumente für AlertDialog und AlertDialog.Builder.

Hoffe, das hilft irgendwie. Viel Glück. :)

+0

Sie können einfach verwenden: ad = new AlertDialog.Builder (this) .create(); – Asama

+0

@ Asama Yup. Aber ich habe es aus Gründen der Klarheit so gemacht. –

+0

Danke das hat wie ein Charme funktioniert .. !! –

0

In Ihrem Code vergessen Sie, Warndialog zu bauen. Sehen Sie diese

AlertDialog alertDialog = alert.create(); 
    alertDialog.show(); 

Sie eine Warnmeldung von private AlertDialog.Builder alert;

+0

Es sollte alert.create() wie Sie sein definieren Builder als Alarm und nicht alertdialogbuilder :) – Asama

+0

@Asama der obige Code ist ein Beispiel-Code und der untere die Erklärung aus der Frage, beide sind verschiedene Code-Schnipsel – UserSharma

+0

@Asama jetzt bearbeite ich die Antwort nach dem Code der Frage – UserSharma

Verwandte Themen