如何从AsyncTask返回布尔值?

23

我有一些EditTexts,用户输入ftp地址、用户名、密码、端口和一个testConnection按钮。如果连接成功建立,它返回一个布尔值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();

                // }
            }
        });

而我的异步任务

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

你希望状态值回到UI线程上吗? - Blackbelt
是的。这是可能的吗? - RapsFan1981
3个回答

43
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,那么它内部的代码将在UI线程上运行。否则,你需要通过Handler发布一个Runnable

我最终采用了你的答案,因为我真的很喜欢这种方法。 - RapsFan1981
1
我倾向于实现委托模式,而不依赖上下文。 - Blackbelt
@Blackbelt 如果我传递的是数组而不是布尔值 myMethod(ArrayList result),我该如何检查它? - Moudiz
以与@Moudiz相同的方式操作。只需将“boolean”更改为您想要传递的对象类型。例如,ArrayList<String> resultsbyte[] result - Blackbelt

13
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

声明您的异步任务如下

public class AsyncConnectTask extends AsyncTask<Void, Void, Boolean>
第三个参数是由doinbackground返回的结果参数。(第一个参数是异步任务参数,第二个参数是进度参数)
因此,您的doinbackground和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。


谢谢!在我能接受这个答案之前,还需要等待3分钟。感谢解释。 - RapsFan1981

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接