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()
これについては意味が分からないので、何が違いを生むのかわかりません。