AsyncTask并不总是调用,但是当它发生时,它会出现空值?

时间:2017-02-22 21:35:53

标签: java android android-asynctask nullpointerexception

我看了很多问题和答案,但我找到的并没有真正起作用!

所以基本上如果标题没有用,那么我正在尝试做的是从对话框执行AsyncTask但它没有执行,当它执行时,它将显示为空对象,如果我'老实说这很讨厌!

因此,如果有人可以提供帮助,那就太棒了。

该课程已成为补贴。

这是Async类:

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();

编辑:我注意到我只有doInBackground,但即使我有preExecute,它仍然无效

1 个答案:

答案 0 :(得分: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

在AsyncTask上实现onPostExecute并考虑到该建议

@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
    }
}