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

}

}

questionAnswers(3)

yourAnswerToTheQuestion