Melhor maneira de solicitar dados do servidor
Preciso buscar alguns dados do meu servidor para fazer meu aplicativo funcionar. Para fazer isso, usarei o POST. Tanto quanto eu sei, tenho que solicitar esses dados em um thread que não pode ser o thread principal. Estou achando um pouco difícil colocar os dados que estou recebendo em uma variável definida no thread da interface do usuário. Então, minha pergunta é: qual é a melhor maneira de fazer isso? É correto definir o valor de uma variável definida, por exemplo, na minha atividade principal, com um configurador chamado dentro de uma AsyncTask? Ou pode ser melhor essa opção?
Thread nt = new Thread(){
@Override
public void run(){
try{
//get data with POST and then something like main.setValue(data);
}catch(Exception e){
e.printStackTrace();
}
}
};
nt.start();
Li que posso usar o Interfaces para arquivar isso, mas é um conceito que ainda não entendo muito bem. Eu gostaria de usar diretamente um método que retorne os dados, mas até onde eu sei, isso não é possível. Thabks para o seu tempo!
EDIT: novo código de acordo com a resposta NoChinDeluxe:
public class LoginHandler {
public static class Login extends AsyncTask<String, String, Integer> {
LoginCallback listener;
@Override
protected Integer doInBackground(String... params) {
URL url;
postDataParams.put("name", params[0]);
HashMap<String, String> postDataParams = new HashMap<String, String>();
postDataParams.put("password", params[1]);
try {
url = new URL("http://mashiron.xyz/_03z/gmpia/proc.php");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(15000);
conn.setConnectTimeout(15000);
conn.setRequestMethod("POST");
conn.setDoInput(true);
conn.setDoOutput(true);
OutputStream os = conn.getOutputStream();
BufferedWriter writer = new BufferedWriter(
new OutputStreamWriter(os, "UTF-8"));
writer.write(HttpHandler.getPostDataString(postDataParams));
writer.flush();
writer.close();
os.close();
System.out.println("Respuesta: "+conn.getResponseCode());
return conn.getResponseCode();
} catch (Exception e) {
e.printStackTrace();
return 404;
}
}
protected void onPostExecute(int result){
System.out.println("Respuesta 2: "+result);
listener.onResultReceived(result);
}
}
public interface LoginCallback {
void onResultReceived(int result);
}
}
EDIT: exceção adicionada para NoChinDeluxe:
03-24 17: 38: 09.072 13312-13312 / com.pitazzo.geomoments E / AndroidRuntime: FATAL EXCEPTION: main Processo: com.pitazzo.geomoments, PID: 13312 java.lang.NullPointerException: tentar invocar o método de interface 'void com .pitazzo.geomoments.Handlers.LoginHandler $ LoginCallback.onResultReceived (int) 'em uma referência de objeto nulo em com.pitazzo.geomoments.Handlers.LoginHandler $ Login.onPostExecute (LoginHandler.java:65) em com.pitazzo.geomoments.Handlers. .LoginHandler $ Login.onPostExecute (LoginHandler.java:17) em android.os.AsyncTask.finish (AsyncTask.java:636) em android.os.AsyncTask.access $ 500 (AsyncTask.java:177) em android.os.AsyncTask $ InternalHandler.handleMessage (AsyncTask.java:653) em android.os.Handler.dispatchMessage (Handler.java:102) em android.os.Looper.loop (Looper.java:135) em android.app.ActivityThread.main ( ActivityThread.java:5300) em java.lang.reflect.Method.invoke (método nativo) em java.lang.reflect.Method.invoke (Method.java:372) em com.android.internal.os.ZygoteInit $ MethodAndArgsCaller. execute (ZygoteInit.java:904) em com.android.internal.os.ZygoteInit.main (ZygoteInit.java:699)
EDIT: mais código para NoChainDeluxe
public class LoginActivity extends AppCompatActivity implements LoginHandler.LoginCallback{
EditText name;
EditText password;
Button login;
int code;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login_activity);
/*
if(logueado){
}
*/
name = (EditText) findViewById(R.id.loginuser);
password = (EditText) findViewById(R.id.loginpassword);
login = (Button) findViewById(R.id.loginlogin);
login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String params[] = {name.getText().toString(), password.getText().toString()};
System.out.println("Params: "+params.toString());
new LoginHandler.Login().execute(params);
System.out.println("Respuesta 4: "+code);
if(code == 200){
Toast toast1 =
Toast.makeText(getApplicationContext(),
"Iniciado sesión", Toast.LENGTH_SHORT);
toast1.show();
}else{
Toast toast1 =
Toast.makeText(getApplicationContext(),
"Nombre de usuario y/o contraseña incorrectos: "+code, Toast.LENGTH_SHORT);
toast1.show();
}
}
});
}
public void onResultReceived(int resultado) {
code = resultado;
System.out.println("Respuesta 3: "+code);
}
}