Android: Wie warte ich AsyncTask, um in MainThread zu beenden?

Ich weiß, dass das erste, das du das machst … warum das Heck auf der Welt Du benutzt dann AsyncTask.

Also hier ist mein Problem Ich arbeite an einer Android-App (API 7 für Android 2.1 oder höher), und ich teste auf Emulator und alles war in Ordnung, also dann habe ich auf HTC Sensation getestet und es sagt NetworkOnMainThreadExeption!

  • So legen Sie den Standardwert einer ListPreference fest
  • Enum vs. Statische Konstanten, Speicherplatz
  • ScheduledExecutorService oder ScheduledThreadPoolExecutor
  • PHP: Wie bekomme ich die Version von android .apk Datei?
  • Farbfilter mit xml in ImageView anwenden
  • Android: Klicken Sie auf Ereignis für Statusleiste Benachrichtigung
  • Ich habe einige Bilder heruntergeladen und dann auf die Karte gezogen.

    Um dieses Problem zu lösen, jedes (Internet-Verbindung) in diesem Fall das Herunterladen der Bilder muss ich auf AsyncTask setzen, um zu arbeiten.

    Also brauche ich eine Methode, wie ich weiß, wann alle Bilder fertig sind, damit ich mit dem Zeichnen beginnen kann.

    Ich habe versucht, so viel und kein Ergebnis habe ich keine Ahnung. Ich habe eine Lösung mit Handler aber wenn auf langsamer Netz laufen bekomme ich nullpointer (weil die Bilder nicht heruntergeladen werden).

    Also bitte hilf mir

    BEARBEITEN:

    Hier ist die Idee:

    Bitmap bubbleIcon ; onCreate(){ ... // i am making call for Async new ImgDown().execute(url); //and then i calling functions and classes to draw with that picture bubbleIcon ! DrawOnMap(bubbleIcon); } //THIS IS ASYNC AND FOR EX. SUPPOSE I NEED TO DOWNLOAD THE PIC FIRST class ImgDown extends AsyncTask<String, Void, Bitmap> { private String url; public ImgDown() { } @Override protected Bitmap doInBackground(String... params) { url = params[0]; try { return getBitmapFromURL(url); } catch (Exception err) { } return null; } @Override protected void onPostExecute(Bitmap result) { bubbleIcon = result; bubbleIcon = Bitmap .createScaledBitmap(bubbleIcon, 70, 70, true); } public Bitmap getBitmapFromURL(String src) { try { Log.e("src", src); URL url = new URL(src); HttpURLConnection connection = (HttpURLConnection) url .openConnection(); connection.setDoInput(true); connection.connect(); InputStream input = connection.getInputStream(); // /tuka decode na slika vo pomalecuk kvalitet! BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = 3; Bitmap myBitmap = BitmapFactory .decodeStream(new FlushedInputStream(input)); Log.e("Bitmap", "returned"); return myBitmap; } catch (IOException e) { e.printStackTrace(); Log.e("getBitmapFromURL", e.getMessage()); return null; } } class FlushedInputStream extends FilterInputStream { public FlushedInputStream(InputStream inputStream) { super(inputStream); } public long skip(long n) throws IOException { long totalBytesSkipped = 0L; while (totalBytesSkipped < n) { long bytesSkipped = in.skip(n - totalBytesSkipped); if (bytesSkipped == 0L) { int byteValue = read(); if (byteValue < 0) { break; // we reached EOF } else { bytesSkipped = 1; // we read one byte } } totalBytesSkipped += bytesSkipped; } return totalBytesSkipped; } } } 

    Ich hoffe jetzt ist klarer.

  • Nested Fragments und der Back Stack
  • Android SyncAdapter Automatisches Initialisieren der Synchronisierung
  • Java mmap schlägt auf Android mit "mmap fehlgeschlagen: ENOMEM (Out of Memory)"
  • Android - Zurück-Taste in der Titelleiste
  • So ändern Sie einen TextView Text durch Drücken einer Schaltfläche
  • Verwalten von Aktivitäten aus DialogFragment
  • 4 Solutions collect form web for “Android: Wie warte ich AsyncTask, um in MainThread zu beenden?”

     class OpenWorkTask extends AsyncTask { @Override protected Boolean doInBackground(String... params) { // do something return true; } @Override protected void onPostExecute(Boolean result) { // The results of the above method // Processing the results here myHandler.sendEmptyMessage(0); } } Handler myHandler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case 0: // calling to this function from other pleaces // The notice call method of doing things break; default: break; } } }; 

    Sie können Ihren eigenen Delegierten schreiben, um Informationen über die Beendigung der Aufgabe zu delegieren, mit OOP-Prinzipien:

    Task_delegate.java

     public interface TaskDelegate { void TaskCompletionResult(String result); } 

    Main_activity.java

     public class MainActivity extends Activity implements TaskDelegate { //call this method when you need private void startAsynctask() { myAsyncTask = new MyAsyncTask(this); myAsyncTask.execute(); } //your code @Override public void TaskCompletionResult(String result) { GetSomethingByResult(result); } } 

    My_asynctask.java

     public class MyAsyncTask extends AsyncTask<Void, Integer, String> { private TaskDelegate delegate; protected MyAsyncTask(TaskDelegate delegate) { this.delegate = delegate; } //your code @Override protected void onPostExecute(String result) { delegate.TaskCompletionResult(result); } } 
     class openWorkTask extends AsyncTask<String, String, Boolean> { @Override protected Boolean doInBackground(String... params) { //do something return true; } @Override protected void onPostExecute(Boolean result) { // The results of the above method // Processing the results here } } 

    Ich würde einen Fortschrittsdialog verwenden, wenn ich Sie wäre. Auf diese Weise können Benutzer sehen, dass etwas passiert, während die ASyncTask das Bild herunterlädt. Auf PostExecute rufen Sie eine Methode aus Ihrem Hauptcode an, die prüft, ob die Bilder null sind. Denken Sie daran, dass Sie die Benutzeroberfläche in der doInBackground-Methode nicht aktualisieren können, so dass jede Benutzeroberfläche entweder onPreExecute oder onPostExecute funktioniert

     private class DownloadPictures extends AsyncTask<String, Void, String> { ProgressDialog progressDialog; @Override protected String doInBackground(String... params) { //Download your pictures return null; } @Override protected void onPostExecute(String result) { progressDialog.cancel(); //Call your method that checks if the pictures were downloaded } @Override protected void onPreExecute() { progressDialog = new ProgressDialog( YourActivity.this); progressDialog.setMessage("Downloading..."); progressDialog.setCancelable(false); progressDialog.show(); } @Override protected void onProgressUpdate(Void... values) { // Do nothing } } 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.