1

我正在设备上测试我的应用程序,在执行某个活动 5 或 6 次后,应用程序崩溃并出现错误:java.lang.IllegalStateException: calling this from your main thread can lead to deadlock

活动很简单:用户放入一个任务并点击保存。此时,我得到他们的用户名和 authtoken 并向我的服务器发出 POST 请求。我想知道我的应用程序是否崩溃,因为每次我获取用户名和 authtoken 时。

崩溃发生在下面的代码中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;
    }
}

问题

这不是最佳做法吗?我的应用程序崩溃是因为我不断收到accountandauthtoken吗?有什么方法可以避免这种情况?

4

2 回答 2

1

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

可以从任何线程调用此方法,但返回的 AccountManagerFuture 不得在主线程上使用。

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

我认为这就是你得到例外的原因。

希望有帮助。

于 2014-01-23T14:41:28.143 回答
0
        Thread CrearEventoHilo = new Thread(){
            public void run(){
                //do something that retrun "Calling this from your main thread can lead to deadlock"
            }
        };
        CrearEventoHilo.start();
        CrearEventoHilo.interrupt();
于 2017-03-27T19:47:32.017 回答