为什么AsyncTask在被声明为Activity的内部类或单独的文件时表现不同?

时间:2012-07-20 17:36:08

标签: android android-asynctask

我使用名为Sugar的Android的ORM将我的模型保存在数据库中 我在AsyncTask中使用它。

这是它的声明:

public class LoginTask extends AsyncTask<Object, Integer, String> {

    private Context context;
    private ProgressDialog progressDialog;

    public LoginTask(Context context) {
        this.context = context;
    }

    @Override
    protected void onPreExecute() {
        progressDialog = new ProgressDialog(context) {
            {
                setMessage("Authenticating...");
                setTitle("Login");
                setCancelable(false);
                setIndeterminate(true);
                show();
            }
        };
    }

    @Override
    protected String doInBackground(Object... params) {
        String email = (String) params[0];
        String password = (String) params[1];

        try {
            User user = LoginWebService.loginUser(email, password,
                    context);
            user.save();
        } catch (CommunicationException e) {
            e.printStackTrace();
            return e.getMessage();
        }

        return null;
    }

    @Override
    protected void onPostExecute(final String result) {
        progressDialog.dismiss();
    }
}

上面的行 user.save(),用于保存数据库中的用户模型,是引发异常的行。奇怪的是,如果我将上面的任务声明为活动的内部类,它可以正常工作,但如果我在单独的文件上声明任务,它会抛出此异常:

E/AndroidRuntime(17172):    at com.app.task.LoginTask.doInBackground(LoginTask.java:47)
E/AndroidRuntime(17172):    at com.app.task.LoginTask.doInBackground(LoginTask.java:1)
E/AndroidRuntime(17172):    at android.os.AsyncTask$2.call(AsyncTask.java:264)
E/AndroidRuntime(17172):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
E/AndroidRuntime(17172):    ... 5 more
E/AndroidRuntime(17172): Caused by: java.lang.RuntimeException: Cant create handler inside thread that has not called Looper.prepare()

我看不出有什么区别,因为我对此没有任何意义。

3 个答案:

答案 0 :(得分:3)

您正尝试从后台线程访问/更新UI。日志cat的最后一句中抛出的异常表示“这些”类型的交互。如果它是活动的内部类,这也会崩溃。

证明你正在通过context。另一个问题因为那可能也是问题所在。这是AsyncTask的活动或上下文的上下文?它需要什么背景?

答案 1 :(得分:0)

我看到这是一个非常古老的帖子,但我想为将来提到这个问题的人做出一些努力来回答这个问题。

我遇到了类似的问题,以下步骤解决了这个问题。

您可以通过适当设置来避免或解决此问题,

<meta-data android:name="DOMAIN_PACKAGE_NAME" android:value="com.example" />
in your AndroidManifest.xml

original guide中提到这些参数都是可选的,但如果没有设置此参数,您可能会遇到上述异常。

我还在主要仓库上发布了一个问题,要求更新指南here

答案 2 :(得分:0)

您使用的是版本1.3吗?

我正在使用版本1.3而不是在我的清单中使用DOMAIN_PACKAGE_NAME并在AsyncTask中执行相同的操作,实际上我正在使用ProgressDialog在AsyncTask中执行大量数据库工作...

如果你想强调一些事情,我的清单中的应用程序标签有android:persistent =“true”标签添加。

我的主要活动还有android:launchMode =“singleTask”,但我也从其他Activity调用了一些AsyncTask。