我如何从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
调用myMethod
, onPostExecute
其内部的代码将在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。