3

我正在使用一个名为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()

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

4

3 回答 3

3

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

证明是你通过了context. 另一个问题,因为这也可能是问题。这是活动的上下文还是 AsyncTask 的上下文?它需要什么上下文?

于 2012-07-20T17:49:00.180 回答
0

您使用的是 1.3 版吗?

我使用的是 1.3 版,没有在我的清单中使用 DOMAIN_PACKAGE_NAME 并在 AsyncTask 中做同样的事情,实际上我正在使用 ProgressDialog 在 AsyncTask 中做很多数据库工作......

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

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

于 2014-08-28T12:19:53.837 回答
0

我看到这是一个非常古老的线程,但我想为那些将来提到这个问题的人付出一些努力。

我有一个类似的问题,下面的步骤解决了这个问题。

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

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

原指南中已经提到,这些参数都是可选的,但是没有设置这个参数,你可能会遇到上面的异常。

我还在主仓库上打开了一个问题,要求在此处更新指南

于 2014-08-27T21:27:40.110 回答