2013-05-25 15 views
14

私は、ユーザがftpアドレス、ユーザ名、パスワード、ポート、そしてtestConnectionボタンを入力するいくつかのEditTextを持っています。接続が正常に確立されると、ブール値trueを返します。AsyncTaskからブール値を返すにはどうすればよいですか?

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

       } 

私は様々なftpの操作を実行するAsyncTasksを使用するように私のコードを再加工していますが、接続が正常に行われた場合、どのように私は、ブール値を返す渡すことができますか?

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

       // } 
      } 
     }); 

そして、私の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

を実行してステータス値をUIスレッドに戻す必要がありますか? – Blackbelt

+0

はい。それは可能ですか? – RapsFan1981

答えて

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

それ内のコードは、UIスレッド上で実行されます。それ以外の場合は、Handler

+0

私は本当にこのアプローチが好きなので、私はあなたの答えを使用して終了しました。 – RapsFan1981

+1

私はdelageteパターンを実装し、コンテキストに依存しないことを好む – Blackbelt

+0

私は今日何か新しいことを学びました。 – 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

三番目のパラメータは、doinbackgroundによって返される結果パラメータである

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

のようなあなたのasynctaskを宣言します。 (最初のものはasynctask paramです2つ目は、進行パラメータである)

バックグラウンドでので、あなたのDOとonpostexecuteは

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

は、doInBackgroundから返された値がパラメータとしてonPostExecuteによってcathcedされていることに注意してくださいになります。 onPostExecuteメソッドでこれを使用してください。この方法でもUIを更新することができます。あなたはonPostExecuteからmyMethodを呼び出す場合

+0

ありがとう!私はこの答えを受け入れる前に3分以上待ちます。説明をありがとう – RapsFan1981

+0

あなたは歓迎です:) – stinepike

関連する問題