Ich versuche, einen Ordner mit Android AsyncTask
zu entpacken. Die Klasse (Decompress genannt) ist eine innere Klasse von Unzip
, wobei Unzip selbst eine Nicht-Aktivitätsklasse ist. Der Pseudo-Code ist:Innere Klasse kann auf Werte zugreifen, aber nicht aktualisieren - AsyncTask
public class Unzip {
private String index;
private String unzipDest; //destination file for storing folder.
private Activity activity;
private boolean result; //result of decompress.
public void unzip(String loc) {
Decompress workThread = new Decompress(loc, activity);
workThread.execute();
if(unzip operation was successful) {
display(index);
}
//Class Decompress:
class Decompress extends AsyncTask<Void, Integer, Boolean> {
private ProgressDialog pd = null;
private Context mContext;
private String loc;
private int nEntries;
private int entriesUnzipped;
public Decompress(String location, Context c) {
loc = location;
mContext = c;
nEntries = 0;
entriesUnzipped = 0;
Log.v(this.toString(), "Exiting decompress constructor.");
}
@Override
protected void onPreExecute() {
Log.v(this.toString(), "Inside onPreExecute.");
pd = new ProgressDialog(mContext);
pd.setTitle("Unzipping folder.");
pd.setMessage("Unzip in progress.");
pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
Log.v(this.toString(), "Showing dialog and exiting.");
pd.show();
}
@Override
protected Boolean doInBackground(Void... params) {
//unzip operation goes here.
unzipDest = something; //unzip destination is set here.
if(unzip operation is successful) {
result = true;
index = url pointing to location of unzipped folder.
} else {
result = false;
}
}
@Override
protected void onPostExecute(Boolean result) {
if(result) {
if(pd != null) {
pd.setTitle("Success");
pd.setMessage("folder is now ready for use.");
pd.show();
pd.dismiss();
pd = null;
Log.v(this.toString(), "Unzipped.");
index = unzipDest + "/someURL";
Log.v(this.toString(), "index present in: " + index);
}
} else {
pd = ProgressDialog.show(mContext, "Failure", "Cannot unzip.");
pd.dismiss();
}
}
}
Probleme Ich bin vor:
1. Der Wert von unzipDest
und index
, in doInBackground
aktualisiert, null bleiben Unzip
und alle seine Objekte. Wie kann ich sicherstellen, dass die Werte aktualisiert bleiben?
2. Ich weiß, dass DoInBackground in einem Thread auftritt, der vom Haupt-UI-Thread getrennt ist. Bedeutet das, dass alle im neuen Thread aktualisierten Werte verloren gehen, sobald der Thread zurückkehrt?
Schöne Antwort. OP - im Allgemeinen möchten Sie vielleicht über die Regeln und Typen von verschachtelten Klassen nach dem Java-Standard lesen: http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html –
@codeMagic: Vielen Dank für Ihre Antwort. Ich möchte auf die Datei zugreifen können, deren URL in 'index' gespeichert wird, nachdem der Entpackvorgang in 'workThread.execute()' erfolgreich abgeschlossen wurde. In der Frage, mit der Sie verbunden sind, verstehe ich nicht, wie die Schnittstelle 'AsyncResponse' initialisiert wurde. Kannst du bitte Erklären? Vielen Dank. – Sriram
@Sriram Ich habe bearbeitet. Ich hoffe das klärt es ein bisschen auf. Bitte versuchen Sie es und fragen Sie, wenn Sie stecken bleiben. – codeMagic