我看了很多问题和答案,但我找到的并没有真正起作用!
所以基本上如果标题没有用,那么我正在尝试做的是从对话框执行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
,它仍然无效
答案 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
}
}