java Externe AsyncTask-Klasse mit ProgressDialog



android android-asynctask (3)

Ok, das habe ich gemacht, als ich Fragmente benutzte. So rufen Sie die AsyncTask in einem Fragment auf:

String result=new AsyncClass(getActivity()).execute();

Und so sieht meine äußere Klasse AsyncTask aus:

public class AsyncClass extends AsyncTask<Void, Void, String> {

    ProgressDialog pdialog;

    public AsyncClass(Context context) {
        pdialog = new ProgressDialog(context);
    }

    @Override
    protected void onPreExecute() {
        pdialog.setIndeterminate(true);
        pdialog.setCancelable(false);
        pdialog.setTitle("Loading Feed..");
        pdialog.setMessage("Please wait.");pdialog.show();
    }

    @Override
    protected String doInBackground(Void... params) {
        String result=null;
        //do your task here and generate result String
        return result;
    }

    @Override
    protected void onPostExecute(String result) {
        if(pdialog.isShowing())
             pdialog.dismiss();
    }
}

@ SSZero danke gute Antwort, hat mir sehr geholfen.

** Aktualisiert: (Siehe unten) ** Ich habe mich seit einigen Tagen umgesehen und kann keine klare Antwort darauf finden. Einige sagen, dass es einigen möglich ist, zu sagen, dass es nicht so ist. Ich bin verrückt danach.

Was ich will, ist nur die AsyncTaskTask zeigen eine Fortschrittsanzeige eine externe Klasse. Dazu gebe ich den Kontext weiter, wie Sie in der Hauptklasse sehen können. Aber was auch immer ich versuche, NullPointerException ich NullPointerException .

Arbeitscodebeispiele werden geschätzt. Vielen Dank

Mit Android 2.2 übrigens.

Main:

import android.app.Activity;
import android.os.Bundle;

public class AsyncDemo extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        new AsyncClass(this).execute();
    }
}

AsyncClass.java

import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;
import android.os.SystemClock;

public class AsyncClass extends AsyncTask<Void, String, Void> {
    private Context context;
    ProgressDialog dialog = new ProgressDialog(context);

    public AsyncClass(Context cxt) {
        context = cxt;
    }

    @Override
    protected void onPreExecute() {
        dialog.setTitle("Please wait");
        dialog.show();
    }

    @Override
    protected Void doInBackground(Void... unused) {
        SystemClock.sleep(2000);
        return (null);
    }

    @Override
    protected void onPostExecute(Void unused) {
        dialog.dismiss();
    }
}

Update: Ich habe eine Follow-up-Frage: Mit dem obigen Code ist es möglich, einen Wert aus der onPostExecute-Methode zurück in die Hauptklasse, irgendwie? (Tut mir leid, dass ich noobish bin) Ich habe so etwas probiert:

String result = new AsyncClass(this).execute();

und dann eine Methode, die einen String zurückgibt. Aber ich kann das nicht, weil ich:

Type mismatch: cannot convert from AsyncTask<String,Void,Void> to String

Was kann ich tun, um dieses Problem anzugehen? Vielen Dank.


Sie haben den ProgressDialog mit einem Nullkontext erstellt. Der folgende Code funktionierte für mich.

public class AsyncClass extends AsyncTask<Void, String, Void> {
    private Context context;
    ProgressDialog dialog;

        public AsyncClass(Context cxt) {
            context = cxt;
            dialog = new ProgressDialog(context);
        }

        @Override
        protected void onPreExecute() {
            dialog.setTitle("Please wait");
            dialog.show();
        }

        @Override
        protected Void doInBackground(Void... unused) {
            SystemClock.sleep(2000);
            return (null);
        }

        @Override
        protected void onPostExecute(Void unused) {
            dialog.dismiss();
        }
    }

Ich möchte diese Folgefragen beantworten, dh

Ich habe eine Follow-up-Frage: Mit dem oben genannten Code, ist es möglich, einen Wert aus der onPostExecute-Methode zurück in die Hauptklasse, irgendwie? (Tut mir leid, dass ich noobish bin) Ich habe so etwas probiert:

String result = new AsyncClass(this).execute();

Ich habe das in meinem Code getan, es hat funktioniert.

AsyncClass ac=new AsyncClass();

ac.execute("");

String rslt=ac.get();

Rufen Sie diesen Code an, wo immer Sie möchten.

public class AsynchClass extends AsyncTask <String,Integer,String>
{

    public String result=null;


    @Override
    protected void onPreExecute() {
    // TODO Auto-generated method stub  

    }

    protected String doInBackground(String... params) 
    {

            // Do all your background task here

            return result;

    }
    @Override

    protected void onProgressUpdate(Integer... values) {


    }

    protected void onPostExecute(String result) {

    }
}