如何从 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中文网其他相关文章!