如何退还从AsyncTask的一个布尔值?布尔值、AsyncTask

2023-09-11 10:43:47 作者:深爱乃沉默

我有一个用户输入FTP地址,用户名,密码,端口安达testConnection按钮一些EditTexts。如果连接成功estabished它返回一个布尔值。

 布尔状态= ftpConnect(_address,_username,_password,_port);
                ftpDisconnect();

                如果(状态==真){
                 Toast.makeText(SiteManager.this,连接成功的,
                 Toast.LENGTH_LONG).show();
                 } 其他 {
                 Toast.makeText(SiteManager.this,
                 连接失败:+状态,Toast.LENGTH_LONG).show();

                 }
 

我返工我的code使用AsyncTasks执行各种FTP操作,但我怎么能传回一个布尔值,如果成功建立连接?

  testConnection.setOnClickListener(新OnClickListener(){

            @覆盖
            公共无效的onClick(视图v){
                _name = etSitename.getText()的toString()。
                _address = etAddress.getText()的toString()。
                _username = etUsername.getText()的toString()。
                _password = etPassword.getText()的toString()。
                _port =的Integer.parseInt(etPort.getText()的toString());

                AsyncConnectTask任务=新AsyncConnectTask(SiteManager.this,
                        _address,_username,_password,_port);
                task.execute();
                //布尔状态= ftpConnect(_address,_username,_password,
                // _端口);
                // ftpDisconnect();

                //如果(状态==真){
                // Toast.makeText(SiteManager.this,连接成功的,
                // Toast.LENGTH_LONG).show();
                // savesite.setVisibility(0);
                // } 其他 {
                // Toast.makeText(SiteManager.this,
                //连接失败:+状态,Toast.LENGTH_LONG)
                // 。显示();

                //}
            }
        });
 

和我的AsyncTask

 公共类AsyncConnectTask扩展的AsyncTask<虚空,虚空,虚空> {
    私人语境mContext;
    私人FTPHelper ftpHelper =新FTPHelper();
    私人字符串_address;
    私人字符串_user;
    私人字符串_pass;
    私人诠释_port;
    ProgressDialog progressDialog;

    公共AsyncConnectTask(上下文的背景下,字符串的地址,字符串用户,
            字符串传递,INT端口){
        mContext =背景;
        _address =地址;
        _user =用户;
        _pass =通;
        _port =口;
    }

    //声明其他对象按你的需要
    @覆盖
    在preExecute保护无效(){
        progressDialog = ProgressDialog.show(mContext,请等待,
                流程说明文字,真正的);

        //需要的对象做初始化对象这里
    };

    @覆盖
    保护无效doInBackground(虚空...... PARAMS){

        布尔值状态= ftpHelper.ftpConnect(_address,_user,_pass,_port);
        返回null;
    }

    @覆盖
    保护无效onPostExecute(无效的结果){
        super.onPostExecute(结果);
        progressDialog.dismiss();
    };
}
 
AsyncTask研究 以Android 10.0为准

解决方案

 公共接口MyInterface的{
    公共无效myMethod的(布尔结果);
}

公共类AsyncConnectTask扩展的AsyncTask<虚空,虚空,布尔> {

    私人MyInterface的mListener;


    公共AsyncConnectTask(上下文的背景下,字符串的地址,字符串用户,
        字符串传递,INT端口,MyInterface的mListener){
        mContext =背景;
        _address =地址;
        _user =用户;
        _pass =通;
        _port =口;
        this.mListener = mListener;
    }

    @覆盖
    保护布尔doInBackground(空... PARAMS){
        ....
        返回结果;
   }


    @覆盖
    保护无效onPostExecute(布尔结果){
        如果(mListener!= NULL)
            mListener.myMethod(结果);
    }
}

AsyncConnectTask任务=新AsyncConnectTask(SiteManager.this,
                        _address,_username,_password,_port,新MyInterface的(){
    @覆盖
    公共无效myMethod的(布尔结果){
        如果(结果==真){
            Toast.makeText(SiteManager.this,连接成功的,
            Toast.LENGTH_LONG).show();
        } 其他 {
            Toast.makeText(SiteManager.this,连接失败:+状态,Toast.LENGTH_LONG).show();
        }
    }
});

task.execute();
 

如果你调用 myMethod的 onPostExecute 里面的code将运行在UI线程。否则,你需要发布一个Runnable通过处理程序

I have some EditTexts that a user enters an ftp address, username, password, port anda testConnection button. If a connection is successfully estabished it returns a boolean value of 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();

                 } 

I'm reworking my code to use AsyncTasks to perform the various ftp operations, but how can I pass back a boolean value if a connection is successfully made?

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

                // }
            }
        });

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

If you call myMethod from onPostExecute the code inside it will run on the UI Thread. Otherwise you need to post a Runnable through a Handler