我如何从AsyncTask返回一个布尔值?

我有一些EditTexts,用户input一个FTP地址,用户名,密码,端口和testConnectionbutton。 如果连接成功build立,则返回一个布尔值true。

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

我正在修改我的代码以使用AsyncTasks来执行各种ftp操作,但是如果连接成功完成,如何传回布尔值?

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

如果您从onPostExecute调用myMethodonPostExecute其内部的代码将在UI线程上运行。 否则,您需要通过Handler发布Runnable

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

宣布你的asynctask像

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

第三个参数是doinbackground返回的结果参数。 (第一个是asynctask参数,第二个是进度参数)

所以你的背景和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作为参数。 所以在onPostExecute方法中使用这个。 你也可以用这个方法更新你的UI。