首页 >Java >java教程 >如何从 Android AsyncTask 正确返回布尔值?

如何从 Android AsyncTask 正确返回布尔值?

Barbara Streisand
Barbara Streisand原创
2024-12-11 10:38:10645浏览

How to Properly Return a Boolean Value from an Android AsyncTask?

如何从 AsyncTask 返回布尔值

在 Android 编程中,AsyncTask 是一个设计用于在单独线程中执行后台操作的类。在这种情况下,当您需要从异步任务返回布尔值时就会出现挑战,因为它是异步操作的。

考虑这样的场景,其中您有一个带有 EditTexts 的用户界面,用于 FTP 地址、用户名、密码、和港口。当用户单击“testConnection”按钮时,将尝试连接,并根据连接状态返回布尔值。

从异步任务返回布尔值的挑战

最初,代码可能看起来与提供的示例类似:

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

 } 

但是,使用AsyncTask时,doInBackground内的代码会在后台运行,无论后台运行的结果如何,都会调用onPostExecute方法。这意味着布尔状态在onPostExecute方法中将不可用。

解决方案:实现回调接口

为了克服这个挑战,我们可以实现一个回调接口。具体方法如下:

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

现在,在您的 Activity 或片段中:

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

此方法可确保 doInBackground 的结果通过回调接口传递回 UI 线程。您可以从 onPostExecute 调用 myMethod 在 UI 线程上执行代码,否则,您需要通过 Handler 发布 Runnable。

以上是如何从 Android AsyncTask 正确返回布尔值?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn