0

私のサービスでは、サービス のdoInBackground()メソッド内でhttp://loopj.com/android-async-http/を使用しています。非同期であるため、コールバックが呼び出される前にメソッドが終了します。したがって、onPostExecuteが呼び出され、サービスがシャットダウンされます...これを回避するにはどうすればよいですか?

public class LoginService extends AsyncTask<String, Void, LoginService.LoginStatus> {

    private static String TAG = "x-LoginService";
    private ProgressDialog progressDialog;
    private AlertDialog dialog = null;

    private final Context context;

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

    @Override
    protected void onPreExecute() {
        progressDialog = ProgressDialog.show(context, "", context.getString(R.string.waitingLogin), true);
    }

    @Override
    protected void onPostExecute(LoginStatus loginStatus) {
        progressDialog.dismiss();
        Log.d(TAG, "--STARTONPOSTEXECUTE");
        String message;
        LocalSettingsService settings = new LocalSettingsService(context);

        if (loginStatus == LoginStatus.LOGGED_IN) {
            settings.put("loggedIn", "true");

            Intent intent = new Intent(context, FragmentTabs.class);
            context.startActivity(intent);

            //Intent intent = new Intent(context, SummaryPage.class);
            //Intent intent = new Intent(context, FeedbackPage.class);
            //Intent intent = new Intent(context, NavTab.class);
            //context.startActivity(intent);

            return;

        } else if (loginStatus == LoginStatus.INVALID_CREDENTIALS) {
            settings.put("loggedIn", "false");

            message = context.getString(R.string.invalidCredentials);
        } else {
            settings.put("loggedIn", "false");
            message = context.getString(R.string.serverError);
        }

        dialog = new AlertDialog.Builder(context)
                .setIcon(android.R.drawable.ic_dialog_alert)
                .setTitle(context.getString(R.string.errorTitle))
                .setMessage(message)
                .setPositiveButton(context.getString(R.string.ok), new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        dialogInterface.dismiss();
                    }
                }).create();

        dialog.show();
    }

    @Override
    protected LoginStatus doInBackground(String... strings) {
        String username = strings[0];
        String password = strings[1];

        doLogin();

        return LoginStatus.LOGGED_IN;
    }

    private void doLogin() {
    {
        Log.d(TAG, "--STARTDOLOGIN");
        RequestParams params = new RequestParams();
        params.put("username", "un");
        params.put("password", "pw");
        ServicesRestClient.post("ajax/login", params, new JsonHttpResponseHandler() {
            @Override
            public void onSuccess(String s) {
                Log.d(TAG, "--ONSUCCESS");

            }
            @Override
            public void onFailure(Throwable throwable, String s) {
                Log.d(TAG, "--ONFAILURE");
            }
        });
    }

    }

    public void onPause() {
        if (dialog != null) {
            dialog.dismiss();
        }
    }

    public static enum LoginStatus {
        LOGGED_IN, INVALID_CREDENTIALS, SERVER_SIDE_ERROR
    }
}
4

1 に答える 1

1

このコードは複雑すぎると思います。一般的に、サービスが終了しない限り、何とかして滞在する必要がdoInBackground()ありますが、使用するものの内部がわからない場合は、最善の方法を説明できます。しかし、あなたが使用するこのライブラリは非同期ネットワークを実行していることをアナウンスするので、私はそもそも別の非同期タスクを使用しません

于 2012-11-22T21:41:28.070 に答える