我使用名为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()
我看不出有什么区别,因为我对此没有任何意义。
答案 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。