【问题标题】:Get back to Android activity after background thread is complete后台线程完成后返回 Android 活动
【发布时间】:2013-06-20 02:48:46
【问题描述】:

我在我的 Android 应用中使用 Parse,我的代码如下所示:

public class SignupActivity extends Activity {
//Collect signup data
User.signupInBackground(data);
}



public class User{
//User methods, constructors, etc
public static void signup(data){
ParseUser pUser = new ParseUser();
//Build data into pUser
pUser.signUpInBackground(new SignUpCallback() {
        public void done(ParseException e){
            if (e!=null){
                Log.v("Signup",e.toString());
            }
        }

    });

所以问题是,我如何在 signUpInBackground 过程完成时通知我的活动?我不能让 SignupActivity 实现 SignUpCallback,因为它是一个抽象类,我必须扩展 Activity。

最终,我要做的是显示一个对话框或等待动画,然后在后台线程完成时将其删除。或者,后台线程可以启动一个活动。这样做的问题是User类和匿名内部类没有自己的Context,所以不能启动Activity。

我在这方面还很陌生,所以感谢您的帮助。

【问题讨论】:

    标签: java android multithreading parsing user-interface


    【解决方案1】:

    考虑到您当前的代码结构,有几种方法可能有效。

    1. SignupActivity 中创建一个Handler 并将其传递给User,以便它与活动进行交互。
    2. 使SignUpCallback 成为接口而不是抽象类。
    3. SignupActivity 类中创建SignUpCallback 的concreate 子类的实例;它将可以访问SignupActivity 的方法。

    我假设signUpInBackground 正在工作线程上执行,并且回调是从该线程调用的。如果这是正确的,那么在所有情况下,您都需要通过HandlerSignupActivity 进行交互。因此,除非其他方法允许更简洁的代码,否则我建议使用方法 #1。

    【讨论】:

    • signUpInBackground 在工作线程上运行,然后在 UI 线程上调用 done() 函数
    • @Cyclic - 在这种情况下,只需将SignupActivity 的引用传递给User 对象并使用它从done() 中回调到活动中,或传递@987654334 @ 并让done 发布消息。
    • 我最终传递了一个处理程序......我这样做的方式是在 signup() 方法中将一个局部变量声明为 final 并将该最终变量设置为我传入的处理程序。然后我在匿名函数中使用了本地处理程序变量。这是在类方法中的匿名函数中使用传入参数的正确方法吗?还是有更好的东西?感谢您的帮助
    • @Cyclic - 这个方法听起来和其他方法一样好。远离的主要事情是将与活动相关的值(如处理程序)保存在静态变量中。如果销毁并重新创建活动(例如,如果用户旋转设备),这些可能会导致内存泄漏。
    猜你喜欢
    • 2013-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多