android - 多次执行某个 Activity 时出现 "lead to deadlock"错误

标签 android performance android-account

我正在设备上测试我的应用程序,在执行某个 Activity 5 或 6 次后,应用程序崩溃并出现错误:java.lang.IllegalStateException:从您的主线程调用它会导致死锁

Activity 很简单:用户输入一个任务并点击保存。这时,我得到了他们的用户名和授权 token ,并向我的服务器发出了一个 POST 请求。我想知道我的应用程序是否崩溃,因为每次我都获取用户名和授权 token 。

崩溃发生在以下代码的 new CreateTask 行。

public boolean onOptionsItemSelected(MenuItem menuItem) {
    if (menuItem.getTitle().toString().equalsIgnoreCase("save")) {
        new CreateTask(this,taskName.getText().toString(), getMyAccount().getUsername(), getMyAccount().getAuthToken()).execute();
        return true;
    }
return true
}

getMyAccount() 的代码如下所示:

private MyAccount getMyAccount() {
    MyAccount myAccount = new MyAccount(getApplicationContext());
    return myAccount;
}

最后类 MyAccount 如下所示:

public class MyAccount {
    private static final String TAG = "MyAccount";
    private final Account account;
    private final AccountManager manager;
    private final Context context;
    public MyAccount(final Context context) {
        this.context = context;
        final Account[] accounts = AccountManager.get(context).getAccountsByType("com.myapp");
        account = accounts.length > 0 ? accounts[0] : null;
        manager = AccountManager.get(context);
    }

    public String getPassword() {
        return account!=null? manager.getPassword(account): null;
    }

    public String getUsername() {
        return account!=null? account.name: null;
    }

    public String getAuthToken() {
        if (account != null) {
            AccountManagerFuture<Bundle> future = manager.getAuthToken(account,"com.myapp", false, null, null);
            try {
                Bundle result = future.getResult();
                return result != null ? result.getString(KEY_AUTHTOKEN) : null;
            } catch (AccountsException e) {
                Log.e(TAG, "Auth token lookup failed", e);
                return null;
            } catch (IOException e) {
                Log.e(TAG, "Auth token lookup failed", e);
                return null;
            }
        }
        else
            return null;
    }
}

问题

这不是最佳做法吗?我的应用程序崩溃是因为我不断重复获取 accountauthtoken 吗?有什么方法可以避免这种情况?

最佳答案

请在 getAuthToken 的描述中注意此声明您正在使用的方法:

This method may be called from any thread, but the returned AccountManagerFuture must not be used on the main thread.

您显然违反了这一点,因为您的 MyAccount#getAuthToken() 正在访问主线程上的 Future:Bundle result = future.getResult();

我认为这就是您获得异常的原因。

希望对您有所帮助。

关于android - 多次执行某个 Activity 时出现 "lead to deadlock"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21311103/

相关文章:

image - 以下一代格式提供图像 : Fallback Image?

java - 如何解决在 android studio 中查看预览的问题?字符串索引超出范围 : -1

android - Firebase 数据库带宽计算

android - 以编程方式更改网络选择模式

performance - 检查 14 位数字是否为质数的最快算法是什么?

java - 资源文件中的最终变量

ruby - 比较 2 个数组,每个数组包含 200,000 多个值

android - Auth.GoogleSignInApi 作为 GoogleAuthUtil 替代谷歌加号登录

android - 在没有 GET_ACCOUNTS 权限的情况下为我们自己的应用程序调用 getAccounts 或 getAccountsByType