私は認証アンドロイドベースのWebサービスのレストを開発しようとしています。私は内部クラスとして非同期タスクでライブラリRetrofitを使用しています。なぜ私の変数は、成功しなかったメソッドの後に初期化されます
私はloginstatusという変数を持っていますが、ユーザーが存在する場合はtrueを返し、それ以外の場合はfalseを返します。
問題は、成功メソッドのうち、コンパイラがoutloginstatusをfalseに初期化するときです。ここで
は、私の活動のコードです:あなたの助けのための
public class CheckLoginActivity extends Activity {
static AlertDialog dialog;
Button b;
UserModel userModel;
TextView statusTV;
EditText userNameET, passWordET;
String editTextUsername;
boolean loginStatus;
String editTextPassword;
String API_URL = "http://192.168.42.60/task_manager/v1/index.php";
SharedPreferences sharedpreferences;
public static final String USERPREFERENCE = "userPreference";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_check_login);
final TextInputLayout usernameWrapper = (TextInputLayout) findViewById(R.id.usernameWrapper);
final TextInputLayout passwordWrapper = (TextInputLayout) findViewById(R.id.passwordWrapper);
usernameWrapper.setHint("Username");
passwordWrapper.setHint("Password");
dialog = new SpotsDialog(this, "Chargement");
//NameText control
userNameET = (EditText) findViewById(R.id.editText1);
passWordET = (EditText) findViewById(R.id.editText2);
//Display Text control
statusTV = (TextView) findViewById(R.id.tv_result);
//Button to trigger web service invocation
b = (Button) findViewById(R.id.button1);
//Display progress bar until web service invocation completes
//Button Click Listener
sharedpreferences = getSharedPreferences(USERPREFERENCE, Context.MODE_PRIVATE);
b.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
//Check if text controls are not empty
if (userNameET.getText().length() != 0 && userNameET.getText().toString() != "") {
if (passWordET.getText().length() != 0 && passWordET.getText().toString() != "") {
editTextUsername = userNameET.getText().toString();
editTextPassword = passWordET.getText().toString();
// statusTV.setText("");
//Create instance for AsyncCallWS
AsyncCallWS task = new AsyncCallWS();
//Call execute
task.execute(editTextUsername, editTextPassword);
}
//If Password text control is empty
else {
statusTV.setText("Please enter Password");
}
//If Username text control is empty
} else {
statusTV.setText("Please enter Username");
}
}
});
}
と私の非同期タスク
private class AsyncCallWS extends AsyncTask<String, String, Void> {
//Make Progress Bar visible
protected void onPreExecute() {
dialog.show();
}
@Override
protected Void doInBackground(String... params) {
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint(API_URL)
.build();
geolocateApi post = restAdapter.create(geolocateApi.class);
post.login(editTextUsername, editTextPassword, new Callback<UserModel>() {
@Override
public void success(UserModel userModelRecv, Response response) {
if (userModelRecv != null) {
SharedPreferences.Editor editor = sharedpreferences.edit();
editor.putString("username", userModelRecv.getUsername());
editor.putString("id", userModelRecv.getUser_id());
editor.putString("firstName", userModelRecv.getFirstName());
editor.putString("lastName", userModelRecv.getLastName());
editor.putString("Role", userModelRecv.getRole());
userModel=userModelRecv;
editor.commit();
loginStatus=true;
}else loginStatus=false;
}
@Override
public void failure(RetrofitError error) {
}
});
return null;
}
@Override
//Once WebService returns response
protected void onPostExecute(Void result) {
//Make Progress Bar invisible
Intent intSucces = new Intent(CheckLoginActivity.this, HomeActivity.class);
try {
Thread.sleep(200);
} catch (Exception e) {
e.printStackTrace();
}
dialog.hide();
//Error status is false
if (loginStatus) {
//Based on Boolean value returned from WebService
//Navigate to Home Screen
startActivity(intSucces);
} else {
//Set Error message
statusTV.setText("Login Failed, try again");
}
}
}
私のインターフェースレトロフィット
public interface geolocateApi {
@FormUrlEncoded
@POST("/login")
public boolean login(@Field("username") String username,@Field("password") String password, Callback<UserModel> response);
}
おかげ
task.execute(editTextUsername、editTextPassword);でパラメータを指定します。あなたはasynctaskでそれらを使用しません。あなたのログインは成功しないかもしれませんし、あなたのログインブール値がまだfalseであるエラーコールバックに出てきます...? – ElDuderino
はい、それはparamsの問題ではありません。それらを削除してもまだWebサービスを返さないsucces私はログに記録してtrueを返しますが、メソッドの成功後にloginstatusはfalseに戻ります。 – user3499324