Java 如何从AsyncTask返回布尔值?
我有一些编辑文本,用户输入ftp地址、用户名、密码、端口和testConnection按钮。如果成功建立连接,它将返回布尔值trueJava 如何从AsyncTask返回布尔值?,java,android,android-asynctask,Java,Android,Android Asynctask,我有一些编辑文本,用户输入ftp地址、用户名、密码、端口和testConnection按钮。如果成功建立连接,它将返回布尔值true boolean status = ftpConnect(_address, _username, _password,_port); ftpDisconnect(); if (status == true) { Toast.makeText(SiteManager.
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();
// }
}
});
还有我的任务
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();
};
}
公共类AsyncConnectTask扩展了AsyncTask{
私有上下文;
私有FTPHelper FTPHelper=新的FTPHelper();
私有字符串地址;
私有字符串用户;
私人字符串传递;
私人国际港口;
进行对话进行对话;
公共异步连接任务(上下文上下文、字符串地址、字符串用户、,
字符串传递,int端口){
mContext=上下文;
_地址=地址;
_用户=用户;
_通过=通过;
_端口=端口;
}
//根据需要声明其他对象
@凌驾
受保护的void onPreExecute(){
progressDialog=progressDialog.show(mContext,“请等待”,
“过程描述文本”,正确);
//在此处执行所需对象的初始化
};
@凌驾
受保护的Void doInBackground(Void…参数){
布尔状态=ftpHelper.ftpConnect(\u地址、\u用户、\u通行证、\u端口);
返回null;
}
@凌驾
受保护的void onPostExecute(void结果){
super.onPostExecute(结果);
progressDialog.disclose();
};
}
公共类AsyncConnectTask扩展了AsyncTask{
@凌驾
受保护的布尔doInBackground(Void…params){
....
返回true;/*或false*/
}
@凌驾
受保护的void onPostExecute(布尔结果){
//结果保存您从doInBackground返回的内容
}
}
像这样声明您的异步任务
public class AsyncConnectTask extends AsyncTask<Void, Void, Boolean>
请记住,doInBackground返回的值由onPostExecute作为参数设置。因此,请在onPostExecute方法中使用此选项。您也可以使用此方法更新UI 公共接口MyInterface{
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();
公共方法(布尔结果);
}
公共类AsyncConnectTask扩展了AsyncTask{
私用MyInterface mListener;
公共异步连接任务(上下文上下文、字符串地址、字符串用户、,
字符串传递、int端口、MyInterface mListener){
mContext=上下文;
_地址=地址;
_用户=用户;
_通过=通过;
_端口=端口;
this.mListener=mListener;
}
@凌驾
受保护的布尔doInBackground(Void…params){
....
返回结果;
}
@凌驾
受保护的void onPostExecute(布尔结果){
if(mListener!=null)
mListener.myMethod(结果);
}
}
AsyncConnectTask=新建AsyncConnectTask(SiteManager.this,
_地址、用户名、密码、端口、新MyInterface(){
@凌驾
公共void myMethod(布尔结果){
如果(结果==真){
Toast.makeText(SiteManager.this,“连接成功”,
Toast.LENGTH_LONG).show();
}否则{
Toast.makeText(SiteManager.this,“连接失败:+状态,Toast.LENGTH_LONG.show();
}
}
});
task.execute();
如果从
onPostExecute
调用myMethod
,其中的代码将在UI线程上运行。否则,您需要通过处理程序发布Runnable
是否希望状态值返回UI线程?是的。有可能吗?谢谢!我得再等3分钟才能接受这个答案。感谢您的解释,我最终使用了您的答案,因为我非常喜欢这种方法。我更喜欢实现delagete模式,而不依赖于context@Blackbelt如果我是传递数组,而不是布尔值`myMethod(ArrayLisy result)`我将如何检查它?@Moudiz以同样的方式。只需根据要传递的对象类型更改boolean
。例如arraylistresults
或byte[]result
@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();
};
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();