HTTPAsyncClient пропускается в первый раз

Я использую HTTPAsyncClient для отправки запроса на сервер, и он активируется нажатием кнопки (именованный флажок), проблема заключается в том, что при первом нажатии я пропускаю переход в TextHttpResponseHandler() и поэтому не отправляет что-нибудь для сервера, но при втором нажатии Он входит в функцию нормально и вызывает сервер, также, когда я переключаюсь на другое действие, он делает то же самое и пропускает вход в обработчик ответа.

РЕДАКТИРОВАТЬ: я отлаживал программу, и я понял, что она не пропускает часть столько, сколько при первом запуске, он вообще не вызывает сервер, и возвращает server_response=null, но при втором вызове он вызывает сервер и все идет прямо

Edit2: изучая мой код с помощью отладки, я понял, что реальная проблема заключается в том, что клиент AsyncHttpClient = new AsyncHttpClient(); для инициализации требуется время, поэтому сначала ответ не поступает, потому что не был отправлен фактический серверный вызов, но во второй раз клиент AsyncHttpClient = new AsyncHttpClient(); инициализируется и устанавливается соединение, поэтому он выдает ответ и работает нормально, теперь вопрос в том, как мне это исправить, чтобы он работал без проблем

Вот код:

public class RegisterFragment extends Fragment {
ProgressBar progressBar;
ImageView checkbutton;
EditText first_name_ET;
EditText last_name_ET;
EditText email_ET;
EditText password_ET;
EditText confirm_password_ET;
EditText phone_ET;
EditText username_ET;
String first_name;
String last_name;
String email;
String password;
String confirm_password;
String phone;
String username;
Pattern pattern;
Matcher matcher;
String URL = "http://198.58.109.238/engezni/public/android/register";
String USER_PREF = "User Pref";
String server_response = null;
String response_function_result = null;


public RegisterFragment() {
    // Required empty public constructor
}

@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    final View view = inflater.inflate(R.layout.fragment_register, container, false);
    progressBar = (ProgressBar) view.findViewById(R.id.progressbar);
    getView();
    progressBar.setVisibility(View.GONE);

    if (view != null) {
        first_name_ET = (EditText) view.findViewById(R.id.first_name_ET);
        last_name_ET = (EditText) view.findViewById(R.id.last_name_ET);
        email_ET = (EditText) view.findViewById(R.id.email_ET);
        password_ET = (EditText) view.findViewById(R.id.password_ET);
        confirm_password_ET = (EditText) view.findViewById(R.id.confirm_password_ET);
        phone_ET = (EditText) view.findViewById(R.id.phone_ET);
        username_ET = (EditText) view.findViewById(R.id.username_ET);
        checkbutton = (ImageView) view.findViewById(R.id.check_button);

    }

    first_name = first_name_ET.getText().toString().trim();
    last_name = last_name_ET.getText().toString().trim();
    email = email_ET.getText().toString().trim();
    password = password_ET.getText().toString().trim();
    confirm_password = confirm_password_ET.getText().toString().trim();
    phone = phone_ET.getText().toString().trim();
    username = username_ET.getText().toString().trim();


    checkbutton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (Validate()) {
                response_function_result = null;
                response_function_result = SendToServer(first_name, last_name, email, password, phone, username);

                if (response_function_result != null) {

                    if (ServerErrorHandler(response_function_result)) {
                /*Saving the fields in shared prefs and going to another activity*/
                        SharedPreferences.Editor save = getActivity().getSharedPreferences(USER_PREF, 0).edit();
                        save.putString("User Name", first_name + " " + last_name);
                        save.putString("Email", email);
                        save.putString("Password", password);
                        save.putString("Phone", phone);
                        save.putString("Name", username);
                        save.commit();

                        Intent intent = new Intent(getActivity(), SignInScreen.class);
                        startActivity(intent);

                    }

                }
            }
        }
    });


    return view;
}

public boolean Validate() {
    first_name = first_name_ET.getText().toString().trim();
    last_name = last_name_ET.getText().toString().trim();
    email = email_ET.getText().toString().trim();
    password = password_ET.getText().toString().trim();
    confirm_password = confirm_password_ET.getText().toString().trim();
    phone = phone_ET.getText().toString().trim();
    username = username_ET.getText().toString().trim();
    final String EMAIL_PATTERN = "^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$";
    pattern = Pattern.compile(EMAIL_PATTERN);
    matcher = pattern.matcher(email);

    if (first_name.length() < 4 || first_name.length() > 30) {
        first_name_ET.setError("First name should be 4 chartacters or more");
        return false;
    } else {
        first_name_ET.setError(null);
    }

    if (last_name.length() < 4 || last_name.length() > 30) {
        last_name_ET.setError("First name should be 4 chartacters or more");
        return false;
    } else {
        last_name_ET.setError(null);
    }

    if (!matcher.matches()) {
        email_ET.setError("Invalid Email ex:example@domain.com");
        return false;
    } else {
        email_ET.setError(null);
    }
    if (password.length() < 6) {
        password_ET.setError("Password has to be 6 characters or more");
        return false;
    } else {
        password_ET.setError(null);
    }

    if (!confirm_password.equals(password)) {
        confirm_password_ET.setError("Password does not match");
        return false;
    } else {
        confirm_password_ET.setError(null);
    }

    if (phone.length() < 11) {
        phone_ET.setError("Phone number invalid");
        return false;
    } else {
        phone_ET.setError(null);
    }


    return true;
}

public String SendToServer(String first_name, String last_name, String email, String password, String phone, String username) {
    AsyncHttpClient client = new AsyncHttpClient();
    StringEntity stringEntity = null;
    JsonArray jsonArray = new JsonArray();
    JsonObject jsonObject = new JsonObject();

    try {
        jsonObject.addProperty("username", first_name + last_name);
        jsonObject.addProperty("email", email);
        jsonObject.addProperty("password", password);
        jsonObject.addProperty("name", username);
        jsonObject.addProperty("phone", phone);
        jsonObject.addProperty("dop", "dummy DOP");
        jsonArray.add(jsonObject);
        stringEntity = new StringEntity(jsonArray.toString());
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }

    client.post(getActivity().getApplicationContext(), URL, stringEntity, "application/json", new TextHttpResponseHandler() {
        @Override
        public void onStart() {
            super.onStart();
            progressBar.setVisibility(View.VISIBLE);
        }

        @Override
        public void onFinish() {
            super.onFinish();
            progressBar.setVisibility(View.GONE);
        }

        @Override
        public void onFailure(int i, Header[] headers, String s, Throwable throwable) {
            Toast.makeText(getActivity(), "onfaaail", Toast.LENGTH_LONG).show();

        }

        @Override
        public void onSuccess(int i, Header[] headers, String s) {

            server_response = s;
            SharedPreferences.Editor save = getActivity().getSharedPreferences(USER_PREF, 0).edit();
            save.putString("Server Response", server_response);
            save.commit();


        }
    });

    return server_response;

}

public boolean ServerErrorHandler(String response) {
    String error_message = "Error Message: ";

    // Checks for errors.
    if (response.contains("INVALID") || response.contains("EXISTS")) {
        // error occured.
        if (response.contains("EMAIL_INVALID")) {
            error_message = error_message + " Invalid Email";
        }
        if (response.contains("PASSWORD_INVALID")) {
            error_message = error_message + " Invalid Password";
        }
        if (response.contains("PHONE_INVALID")) {
            error_message = error_message + " Invalid Phone";
        }
        if (response.contains("NAME_INVALID")) {
            error_message = error_message + " Invalid Name";
        }
        if (response.contains("DOP_INVALID")) {
            error_message = error_message + " Invalid DoP";
        }
        if (response.contains("USERNAME_INVALID")) {
            error_message = error_message + " Invalid Username";
        }
        if (response.contains("USERNAME_EXIST")) {
            error_message = error_message + " Name Exists";
        }
        if (response.contains("EMAIL_EXIST")) {
            error_message = error_message + " Email Exists";
        }
        if (response.contains("PHONE_EXIST")) {
            error_message = error_message + " Phone Exists";
        }

        Toast.makeText(getActivity().getApplicationContext(), error_message, Toast.LENGTH_LONG).show();


        return false;
    } else {
    /*No error*/
        Toast.makeText(getActivity().getApplicationContext(), "Registered", Toast.LENGTH_LONG).show();
        return true;

    }
}
}

1 ответ

Решение

Когда вы делаете это: response_function_result = SendToServer(first_name, last_name, email, password, phone, username);

На ваш сервер проверки сделан асинхронный запрос. Это в основном означает, что есть фоновый поток, в котором сделан весь запрос, и ваш основной поток не ожидает результатов. Таким образом, пока запрос проверки выполняется в фоновом режиме, эта строка выполняется сразу return server_response; который является нулевым и, следовательно, он возвращает нулевое значение.

Другие вопросы по тегам