2017-02-22 46 views
0

Я рассмотрел так много вопросов и ответов, но ничто из того, что я нашел, действительно сработало!AsyncTask не всегда вызывает, но когда он это делает, он имеет значение null?

Так что, если заголовок не помогает, то то, что я пытаюсь сделать, это запустить AsyncTask из диалогового окна, но оно не выполняется, и когда это произойдет, оно будет отображаться как нулевой объект, и если я «Честно говоря, это чертовски раздражает!

Так что если кто-то может помочь, тогда это будет здорово.

Класс подпалубный.

Вот класс Асинхронный:

static class UpdatePassword extends AsyncTask<String, String, String> { 

    Context context; 
    String oldPassword; 
    String newPassword; 

    public UpdatePassword(String setOldPassword, String setNewPassword, Context context) { 
     this.oldPassword = setOldPassword; 
     this.newPassword = setNewPassword; 
     this.context = context; 
    } 

    @Override protected String doInBackground(String... params) { 
     HttpRequestUtils httpRequestUtils = new HttpRequestUtils(context); 
     if (TextUtils.isEmpty(oldPassword) || TextUtils.isEmpty(newPassword)) { 
      return null; 
     } else { 
      String response = null; 
      String baseUrl = "rest/ws/user/update/password"; 
      ApiResponse apiResponse = null; 
      try { 
       response = httpRequestUtils.getResponse(baseUrl + "?oldPassword=" + oldPassword + "&newPassword=" + newPassword, "application/json", "application/json"); 
       if (TextUtils.isEmpty(response)) { 
        return null; 
       } 
       apiResponse = (ApiResponse) GsonUtils.getObjectFromJson(response, ApiResponse.class); 
       if (apiResponse != null && apiResponse.isSuccess()) { 
        return apiResponse.getStatus(); 
       } 
       Log.i("Update", "password call" + apiResponse); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      return newPassword; 
     } 
    } 
} 

И вот что я делаю, чтобы выполнить его:

String oldPassword = changePassOld.getText().toString(); 
String newPassword = changePassNew.getText().toString(); 
AsyncTask task = new UpdatePassword(oldPassword, newPassword, ProfileFragment.this.getContext()); 
task.execute(); 

Edit: я заметил, что у меня есть только doInBackground, но даже тогда, когда я был preExecute , он все равно не сработает

+0

вы отлажена свой postExecute) '' метод (? вы уверены, что нет возврата от 'doInBackground' –

+0

Да, у меня есть и ничего не возвращает – user3125867

+0

Тогда ваша проблема определенно находится в вашем корпусе' doInBackground', он может вернуть null, отладить его и посмотреть, где проблема! –

ответ

0

AsyncTask не всегда вызывает, но когда он это делает, он достигает нуля ?

Это самый интересный AsyncTask;)


Вообще говоря, вы, кажется, не возвращает данные в точку, где вы ожидаете его (или return null условие попадания).

Вы можете вместо этого определить обратный вызов.

public interface PasswordChangeListener { 
    void onPasswordChanged(String oldPass, String newPass); 
} 

Реализовать что на вашем Fragment класса

public class ProfileFragment extends Fragment 
    implements PasswordChangeListener { // See here 

    ... 

    @Override 
    public void onPasswordChanged(String oldPass, String newPass) { 
     Toast.makeText(getActivity(), 
      String.format("Changed %s to %s", oldPass, newPass), 
      Toast.LENGTH_SHORT).show(); 
    } 

Позвоните своему AsyncTask после добавления этого обратного вызова в качестве параметра

(контекст обычно идет первым, кстати)

new UpdatePassword(
    ProfileFragment.this.getActivity(), 
    oldPassword, newPassword, 
    ProfileFragment.this).execute(); 

Предложение: Вы должны return apiResponse; от doInBackground

И реализовать onPostExecute на AsyncTask с этим предложением в виду

@Override 
public void onPostExecute(ApiResponse result) { 
    if (apiResponse != null && apiResponse.isSuccess()) { 
     if (this.callback != null) { 
      callback.onPasswordChanged(this.oldPassword, this.newPassword); 
     } else { 
      Log.w("Password change", "Password callback not set!"); 
     } 
    } else { 
     // TODO: Error handling 
    } 
} 
+0

Я получаю нулевую ссылку на эту строку: 'HttpRequestUtils httpRequestUtils = new HttpRequestUtils (контекст);' – user3125867

+0

Все, что я получаю сейчас, это 'E/Editor: hideClipTrayIfNeeded() TextView сфокусирован !! hideClipTray() ' – user3125867

+0

1) Эта строка httpRequestUtils не должна быть ошибкой, если' context' не является нулевым ... 2) Эта ошибка не связана с вашей AsyncTask –

 Смежные вопросы

  • Нет связанных вопросов^_^