Witam,robię logowanie w android studio z wykorzystaniem php oraz json.
Jeśli udało się zalogować tworzę taki oto kod w Jsonie:
{"error":"false"}
Dalej w androidzie przesyłam metodą POST login oraz hasło przy użyciu biblioteki Volley.
Mój problem polega na tym, że volley nie czeka na odpowiedź z serwera. Dopiero po paru kliknięciach przycisku Zaloguj dostajemy się do konta.
Znalazłem coś takiego : Link
Lecz nadal mam ten sam problem i nie wiem co robię źle.
Czy wie ktoś gdzie leży przyczyna takiego działania ?
Mój kod:
package com.example.mateusz.rentguide;
import android.content.Context;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.VolleyLog;
import com.android.volley.toolbox.Volley;
import com.example.mateusz.rentguide.model.SharedPrefManager;
import com.example.mateusz.rentguide.model.Url;
import com.example.mateusz.rentguide.model.User;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.HashMap;
import java.util.Map;
public class LoginActivity extends AppCompatActivity {
EditText loginText, passwordText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
if (SharedPrefManager.getInstance(this).isLoggedIn()) {
finish();
startActivity(new Intent(this, LoggedActivity.class));
}
//akcja po wcisnieciu przycisku button_sign
//wywolanie metody userLogin()
findViewById(R.id.button_sign).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
loginText = (EditText) findViewById(R.id.login);
passwordText = (EditText) findViewById(R.id.password);
final String login = loginText.getText().toString();
final String password = passwordText.getText().toString();
final String url=Url.getUrlWeb();
Controller controller=new Controller();
controller.userLogin(LoginActivity.this, url,login,password, new ServerCallBack() {
@Override
public void onSuccess(JSONObject result) {
try {
if(!result.getBoolean("error")){
startActivity(new Intent(getApplicationContext(), LoggedActivity.class));
}
} catch (JSONException e) {
e.printStackTrace();
}
}
});
}
});
}
}
package com.example.mateusz.rentguide;
import android.content.Context;
import android.text.TextUtils;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.VolleyLog;
import com.android.volley.toolbox.Volley;
import com.example.mateusz.rentguide.model.Url;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.HashMap;
/**
* Created by mateusz on 09.11.2018.
*/
public class Controller {
public void userLogin(final Context context, String url, final String login, final String password, final ServerCallBack callback) {
HashMap<String, String> params = new HashMap<String, String>();
params.put("login", login);
params.put("password", password);
RequestQueue requestQueue = Volley.newRequestQueue(context);
CustomRequest jsObjRequest = new CustomRequest(Request.Method.POST, url,params,new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
callback.onSuccess(response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
VolleyLog.e("Error: ", error.getMessage());
}
});
requestQueue.add(jsObjRequest);
}
}
package com.example.mateusz.rentguide;
import org.json.JSONException;
import org.json.JSONObject;
/**
* Created by mateusz on 09.11.2018.
*/
public interface ServerCallBack {
void onSuccess(JSONObject result);
}
package com.example.mateusz.rentguide;
import java.io.UnsupportedEncodingException;
import java.util.Map;
import org.json.JSONException;
import org.json.JSONObject;
import com.android.volley.NetworkResponse;
import com.android.volley.ParseError;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.Response.ErrorListener;
import com.android.volley.Response.Listener;
import com.android.volley.toolbox.HttpHeaderParser;
public class CustomRequest extends Request<JSONObject> {
private Listener<JSONObject> listener;
private Map<String, String> params;
public CustomRequest(String url, Map<String, String> params,
Listener<JSONObject> reponseListener, ErrorListener errorListener) {
super(Method.GET, url, errorListener);
this.listener = reponseListener;
this.params = params;
}
public CustomRequest(int method, String url, Map<String, String> params,
Listener<JSONObject> reponseListener, ErrorListener errorListener) {
super(method, url, errorListener);
this.listener = reponseListener;
this.params = params;
}
protected Map<String, String> getParams()
throws com.android.volley.AuthFailureError {
return params;
};
@Override
protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
try {
String jsonString = new String(response.data,
HttpHeaderParser.parseCharset(response.headers));
return Response.success(new JSONObject(jsonString),
HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
return Response.error(new ParseError(e));
} catch (JSONException je) {
return Response.error(new ParseError(je));
}
}
@Override
protected void deliverResponse(JSONObject response) {
// TODO Auto-generated method stub
listener.onResponse(response);
}
}