AsyncTask 中的内部类数据修改
在这种情况下,您有一个内部类 Decompress,它扩展了 AsyncTask 并尝试修改成员其封闭类 Unzip 的变量。然而,当从外部类访问时,这些更改似乎会丢失。
数据更新
问题源于 AsyncTask 异步操作,这意味着它运行在一个单独的线程。虽然对成员变量的修改仍将保留在类中,但由于线程分离,它们可能不会立即反映在封闭类中。为了确保外部类可以访问更新的值,可以实现回调机制。
回调接口
一种解决方案是创建一个接口,其中的方法将当内部类完成其任务并更新值时被回调。在您的示例中,您可以定义如下接口:
public interface InnerClassUpdateListener { void onInnerClassUpdate(String index, String unzipDest); }
实现
在 Decompress 类中,在 AsyncTask 中实现 onInnerClassUpdate 方法。当内部类完成其任务并且值已更新时将调用此方法。在 doInBackground 方法中,添加代码:
if (unzip operation is successful) { result = true; index = url pointing to location of unzipped folder; unzipDest = something; //unzip destination is set here if (callback != null) { callback.onInnerClassUpdate(index, unzipDest); } }
在 Unzip 类中,注册为回调的侦听器。例如:
Decompress decompress = new Decompress(location, activity); decompress.setCallback(new InnerClassUpdateListener(){ @Override public void onInnerClassUpdate(String index, String unzipDest) { // Update your outer class variables here } });
线程注意事项
正如您正确指出的,AsyncTask 在单独的线程中运行。这意味着在此线程中更新的任何值都将保留在该线程中,直到任务完成。但是,一旦任务完成并调用 onPostExecute 方法,更新的值将可供封闭类使用。通过实现回调,您可以确保外部类可以在更新的值可用时访问它们。
以上是为什么我的内部类AsyncTask的数据变化没有反映在外部类中?的详细内容。更多信息请关注PHP中文网其他相关文章!