2013-05-25 13 views
14

Ich habe einige EditTexts, dass ein Benutzer eine FTP-Adresse, Benutzername, Passwort, Port und eine testConnection-Taste eingibt. Wenn eine Verbindung erfolgreich hergestellt wurde, wird ein boolescher Wert von true zurückgegeben.Wie gebe ich einen booleschen Wert von AsyncTask 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 meinen Code bin Nacharbeiten AsyncTasks zu verwenden, um die verschiedenen FTP-Operationen auszuführen, aber wie kann ich einen Booleschen Wert übergeben zurück, wenn eine Verbindung erfolgreich hergestellt wird?

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 mein 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(); 
    }; 
} 
+0

veröffentlichen Sie möchten den Statuswert zurück auf die UI-Thread? – Blackbelt

+0

Ja. Ist das möglich? – RapsFan1981

Antwort

30
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 myMethod von onPostExecute der Code innerhalb nennen es wird auf dem UI-Thread ausgeführt werden. Sonst müssen Sie eine Runnable über eine Handler

+0

Ich endete mit Ihrer Antwort, weil ich diesen Ansatz wirklich mag. – RapsFan1981

+1

Ich bevorzuge es, das delagete Muster zu implementieren und mich nicht auf den Kontext zu verlassen – Blackbelt

+0

Ich habe heute etwas Neues gelernt. – Grigor

11
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 
    } 
} 
11

Erklären Sie Ihre AsyncTask wie

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

Der dritte Parameter ist der Ergebnisparameter, die von doinbackground zurückgegeben wird. (Die erste ist AsyncTask param und zweite ist Parameter Fortschritt)

so im Hintergrund Ihre do und OnPostExecute wird

@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(); 
}; 

sein Denken Sie daran, dass der Wert von doInBackground zurückgegeben wird durch OnPostExecute als Parameter cathced. Verwenden Sie dies in der onPostExecute-Methode. Sie können Ihre Benutzeroberfläche auch in dieser Methode aktualisieren.

+0

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

+0

Sie sind willkommen :) – stinepike

Verwandte Themen