Wie gebe ich einen booleschen Wert von AsyncTask zurück?

Lesezeit: 4 Minuten

Ich habe einige EditTexts, in denen ein Benutzer eine FTP-Adresse, einen Benutzernamen, ein Passwort, einen Port und eine TestConnection-Schaltfläche eingibt. Wenn eine Verbindung erfolgreich hergestellt wurde, gibt sie einen booleschen Wert von wahr zurück.

boolean status = ftpConnect(_address, _username, _password,_port);
                ftpDisconnect();

                if (status == true) {
                 Toast.makeText(SiteManager.this, "Connection Succesful",
                 Toast.LENGTH_LONG).show();
                 } else {
                 Toast.makeText(SiteManager.this,
                 "Connection Failed:" + status, Toast.LENGTH_LONG).show();

                 } 

Ich überarbeite meinen Code, um AsyncTasks zum Ausführen der verschiedenen FTP-Operationen zu verwenden, aber wie kann ich einen booleschen Wert zurückgeben, wenn eine Verbindung erfolgreich hergestellt wurde?

testConnection.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                _name = etSitename.getText().toString();
                _address = etAddress.getText().toString();
                _username = etUsername.getText().toString();
                _password = etPassword.getText().toString();
                _port = Integer.parseInt(etPort.getText().toString());

                AsyncConnectTask task = new AsyncConnectTask(SiteManager.this,
                        _address, _username, _password, _port);
                task.execute();
                // boolean status = ftpConnect(_address, _username, _password,
                // _port);
                // ftpDisconnect();

                // if (status == true) {
                // Toast.makeText(SiteManager.this, "Connection Succesful",
                // Toast.LENGTH_LONG).show();
                // savesite.setVisibility(0);
                // } else {
                // Toast.makeText(SiteManager.this,
                // "Connection Failed:" + status, Toast.LENGTH_LONG)
                // .show();

                // }
            }
        });

Und meine AsyncTask

public class AsyncConnectTask extends AsyncTask<Void, Void, Void> {
    private Context mContext;
    private FTPHelper ftpHelper = new FTPHelper();
    private String _address;
    private String _user;
    private String _pass;
    private int _port;
    ProgressDialog progressDialog;

    public AsyncConnectTask(Context context, String address, String user,
            String pass, int port) {
        mContext = context;
        _address = address;
        _user = user;
        _pass = pass;
        _port = port;
    }

    // declare other objects as per your need
    @Override
    protected void onPreExecute() {
        progressDialog = ProgressDialog.show(mContext, "Please wait for ",
                "Process Description Text", true);

        // do initialization of required objects objects here
    };

    @Override
    protected Void doInBackground(Void... params) {

        boolean status = ftpHelper.ftpConnect(_address, _user, _pass, _port);
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);
        progressDialog.dismiss();
    };
}

  • Sie möchten, dass der Statuswert zurück in den UI-Thread kommt?

    – Schwarzer Gürtel

    25. Mai 2013 um 17:24 Uhr

  • Jawohl. Ist das möglich?

    – RapsFan1981

    25. Mai 2013 um 17:27 Uhr


Wie gebe ich einen booleschen Wert von AsyncTask zuruck
Schwarzer Gürtel

public interface MyInterface {
    public void myMethod(boolean result);
}

public class AsyncConnectTask extends AsyncTask<Void, Void, Boolean> {

    private MyInterface mListener;


    public AsyncConnectTask(Context context, String address, String user,
        String pass, int port, MyInterface mListener) {
        mContext = context;
        _address = address;
        _user = user;
        _pass = pass;
        _port = port;
        this.mListener  = mListener;
    }

    @Override
    protected Boolean doInBackground(Void... params) {
        ....
        return result;
   }


    @Override
    protected void onPostExecute(Boolean result) {
        if (mListener != null) 
            mListener.myMethod(result);
    }
}

AsyncConnectTask task = new AsyncConnectTask(SiteManager.this,
                        _address, _username, _password, _port,  new MyInterface() {
    @Override
    public void myMethod(boolean result) {
        if (result == true) {
            Toast.makeText(SiteManager.this, "Connection Succesful",
            Toast.LENGTH_LONG).show();
        } else {
            Toast.makeText(SiteManager.this, "Connection Failed:" + status, Toast.LENGTH_LONG).show();
        } 
    }
});

task.execute();

Wenn Sie anrufen myMethod von onPostExecute Der darin enthaltene Code wird im UI-Thread ausgeführt. Andernfalls müssen Sie ein Runnable durch a posten Handler

  • Am Ende habe ich Ihre Antwort verwendet, weil ich diesen Ansatz wirklich mag.

    – RapsFan1981

    25. Mai 2013 um 18:47 Uhr

  • Ich setze lieber das delagete Muster um und verlasse mich nicht auf den Kontext

    – Schwarzer Gürtel

    4. Juli 2013 um 7:31 Uhr


  • @Blackbelt Wenn ich ein Array übertrage, nicht das boolesche `myMethod(ArrayLisy result)`, wie würde ich es überprüfen?

    – Modiz

    15. Oktober 2015 um 9:25 Uhr

  • @Moudiz auf die gleiche Weise. Nur ändern boolean mit dem Typ des Objekts, das Sie übergeben möchten. Z.B ArrayList<String> results oder byte[] result

    – Schwarzer Gürtel

    15. Oktober 2015 um 9:27 Uhr

public class AsyncConnectTask extends AsyncTask<Void, Void, Boolean> {

@Override
    protected Boolean doInBackground(Void... params) {
               ....
               return true; /* or false */
}


@Override
    protected void onPostExecute(Boolean result) {
           // result holds what you return from doInBackground
    }
}

Wie gebe ich einen booleschen Wert von AsyncTask zuruck
Steinhecht

Deklarieren Sie Ihre Asynctask wie

public class AsyncConnectTask extends AsyncTask<Void, Void, Boolean>

Der dritte Parameter ist der Ergebnisparameter, der von doinbackground zurückgegeben wird. (Der erste ist asynctask param und der zweite ist progress parameter)

So wird Ihr do im Hintergrund und onpostexecute sein

@Override
protected Boolean doInBackground(Void... params) {

    boolean status = ftpHelper.ftpConnect(_address, _user, _pass, _port);
    return status;
}

@Override
protected void onPostExecute(Boolean result) {
    // use the result
    super.onPostExecute(result);
    progressDialog.dismiss();
};

Denken Sie daran, dass der von doInBackground zurückgegebene Wert von onPostExecute als Parameter erfasst wird. Verwenden Sie dies also in der onPostExecute-Methode. Sie können Ihre Benutzeroberfläche auch mit dieser Methode aktualisieren.

  • Danke! Ich muss noch 3 Minuten warten, bevor ich diese Antwort akzeptieren kann. Danke für die Erklärung

    – RapsFan1981

    25. Mai 2013 um 17:33 Uhr

917080cookie-checkWie gebe ich einen booleschen Wert von AsyncTask zurück?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy