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

これは非常に古いスレッドだと思いますが、今後これを参照する人のために、これに答えるためにいくつかの努力をしたいと思います.

同様の問題があり、以下の手順で問題が解決しました。

適切に設定することで、これを回避または回避できます。

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

元のガイドでは、これらのパラメーターはすべてオプションであると述べられていますが、このパラメーターを設定しないと、上記の例外が発生する可能性があります。

また、ここでガイドを更新するように要求するメイン リポジトリの問題をオープンしました。

于 2014-08-27T21:27:40.110 に答える
0

バージョン 1.3 を使用していますか?

マニフェストでDOMAIN_PACKAGE_NAMEを使用せずにバージョン1.3を使用しており、AsyncTask内で同じことを行っています。実際には、AsyncTask内でProgressDialogを使用して多くのデータベース作業を行っています...

強調したい場合は、マニフェストのアプリケーション タグに android:persistent="true" タグを追加します。

また、私の主なアクティビティには android:launchMode="singleTask" がありますが、他のアクティビティからいくつかの AsyncTask を呼び出しています。

于 2014-08-28T12:19:53.837 に答える