1

Ich versuche, eine Test-App zum Zip und Entpacken einer Datei zu schreiben. Ich habe eine Open-Source-Bibliothek für die Dateikomprimierung/-komprimierung gefunden, aber wie Sie sich vorstellen können, dauert das manchmal, also kann ich es nicht im Hauptfenster ausführen, also dachte ich, ich würde AsyncTask verwenden, um den Hintergrund zu lösen , und dann einfach kotzen begonnen, und eine fertige Nachricht und alles wäre in Ordnung. aber ich habe hier zwei große Probleme. wenn ich den Knopf drücke, geht es und entzippe die Dateien, aber es scheint, es in der Haupt-ui nicht in einem Hintergrundthread zu tun, da die App absperrt und ich bekomme den ANR-Bildschirm, plus ich gucke nach irgendwelchen Neue Threads erscheinen in der ddms-Ansicht und ich sehe keine. Wenn ich es sage, ich möchte es abwarten, wird es die Dateien entpacken. aber natürlich möchte ich nicht, dass das Programm zu frieren scheint oder an mir das andere Problem ist, ich habe es eingestellt, um die Schaltfläche Text sowohl direkt nach dem Klicken auf, und dann wieder, wenn die Aysc Aufgabe abgeschlossen ist, aber noch nicht ich habe ' t sehen, dass sich entweder etwas ändert, ich änderte die Texte so, dass sie alle anders waren, so dass ich es erzählen konnte. es sollte auch ein Textfeld in der Statusmeldung setzen. Ich glaube nicht, dass der onPostExecute jemals aufgerufen wird. Kann mir jemand sagen, was hier vor sich geht?Ich benutze AsyncTask, um eine lange laufende Aufgabe zu tun, aber es scheint immer noch in der Haupt-ui

package net.pawworks.sandbox.svc; 

import java.io.File; 
import net.pawworks.utils.mainlib.filetools; 
import net.pawworks.utils.mainlib.zipper; 
import android.app.Activity; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TextView; 

public class TestserviceActivity extends Activity { 
    /** Called when the activity is first created. */ 
    String readpath= filetools.sdcardpath()+"/ziptestin/"; 
    TextView readstatus; 
    Button readbut; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.ziptest); 
     File setup = new File(filetools.sdcardpath()+"/ziptestout"); 
     setup.mkdir(); 
     setup = new File(filetools.sdcardpath()+"/ziptestin/"); 
     setup.mkdir(); 
     readstatus = (TextView)findViewById(R.id.readstatus); 
     readbut = (Button)findViewById(R.id.readit); 
     readbut.setOnClickListener(new View.OnClickListener() { 

      public void onClick(View v) 
      { 
       readbut.setText("Loading....."); 
       String status=""; 
       // TODO Auto-generated method stub 
       File setup = new File(readpath+"jpgs.zip"); 
       if(setup.canRead()) 
       { 
        status="File Readable\n"; 
        new unpackit().doInBackground(new String[]{"jpgs.zip",status}); 
        readbut.setText("Read!"); 
       } 
       else {status = "File not Readable:"+setup.toString();readstatus.setText(status);readbut.setText("Read.");} 


      } 
     }); 
     } 
    private class unpackit extends AsyncTask<String, Void, String> 
    { 

     @Override 
     protected String doInBackground(String... params) 
     { 
      // TODO Auto-generated method stub 
      Log.e("asynctask", "1:"+params[0]+"2:"+params[1]); 
      zipper d = new zipper(readpath+"jpgs.zip",filetools.sdcardpath()+"/ziptestout/"); 
      d.unzip(); 
      return params[1]+"\n"+d.status(); 
     } 

     @Override 
     protected void onPostExecute(String result) 
     { 
      readstatus.setText(result); 
      readbut.setText("Read?"); 
     } 
    } 
} 
+0

In Ihrem Fall statt neue unpackit von() aufrufen doInBackground (new String [] { "jpgs.zip", status}). , rufe einfach wie neu auf unpackit(). execute (new String [] {"jpgs.zip"}); – Pavandroid

Antwort

7

Sie wollen

Aufruf zu
new unpackit().execute(args); 

statt doInBackground (args). Dies entspricht dem Aufruf von start() in einem Thread und nicht in run(). In diesem Fall führt Ihr UI-Thread nur den Code in doInBackground() aus, aber er ruft nichts anderes auf.

Weitere Informationen finden Sie in der Dokumentation und im Beispielcode here.

+0

mfrankli ist richtig, sollte eine einfache Lösung für Sie sein. –

+0

Das ist richtig. – zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

3
new unpackit().doInBackground(new String[]{"jpgs.zip",status}); 

Ersetzen Sie die obige Zeile unterhalb von ::

new unpackit().execute(new String[]{"jpgs.zip",status});