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 回答