Como receber um valor de um método que se conecta a internet pra obter valores?

Olá, estou tendo uma grande dificuldade para obter valores do banco de dados externo: Tenho uma classe que carrega dados do firebase, em tempo de execução chamo o seguinte metodo para atualizar os dados

private  int retorno = 0;

public int getData() {
    mFirebaseRemotVAlorDoSatoshi.fetch(0).addOnSuccessListener(new OnSuccessListener<Void>() {
        @Override
        public void onSuccess(Void aVoid) {
            mFirebaseRemotVAlorDoSatoshi.activateFetched();
            retorno = (int) mFirebaseRemotVAlorDoSatoshi.getLong("data");
        }
    }).addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {
            if (!isDeviceConnected()) {
                DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        getData();
                    }
                };
                android.support.v7.app.AlertDialog.Builder builder = new android.support.v7.app.AlertDialog.Builder(context);
                builder.setCancelable(false);
                builder.setMessage(context.getString(R.string.prompt__erro_ao_obter_valor_do_satoshi_na_nuvem)).setTitle(context.getString(R.string.aviso_de_conexao)).setPositiveButton(context.getString(R.string.ok), dialogClickListener)
                        .show();

            } else {
                getData();
            }
        }
    });
    return retorno;
}

o problema é que esse método se conecta a internet, ou seja, demora pra dar um retorno e oque recebo quando chamo esse método é 0. Acredito que não se trate de criar threads e sincroniza-las, mais também n tenho muita experiencia com threads então minha opnião n vale nada.

Como faço para que na minha primeira classe eu só passe para a proxima linha de codigo quando esse metodo me retornar o valor correto?

Obrigado a todos.

acho que você precisa criar um metodo AsyncTask() criando um thread separada para obter os dados e não travar sua tela, segue um exemplo abaixo

Chamada:

identar texto pre-formatado em 4 espaços

new SearchActivity.DownloadJsonAsyncTaskCidades().execute(URL);

identar texto pre-formatado em 4 espaços

identar texto pre-formatado em 4 espaços

class DownloadJsonAsyncTaskCidades extends AsyncTask<String, Void, List> {

ProgressDialog dialog;

//Exibe pop-up indicando que está sendo feito o download do JSON
@Override
protected void onPreExecute() {
    super.onPreExecute();
    dialog = ProgressDialog.show(SearchActivity.this, "Aguarde", "Carregando Cidades...");
}

//Acessa o serviço e retorna a lista de hospitais
@Override
protected List<Cidade> doInBackground(String... params) {

    List<Cidade> listaDeCidades = new ArrayList<>();

    Log.i("CONEXAO", "Iniciando conexão com o Servidor...");

    SynchronousHttpConnection httpConnection = new SynchronousHttpConnection();
    try {

        String response = httpConnection.get(URL);

        Log.i("RESPONSE", "Resposta: " + response);

        JSONArray json = new JSONArray(response);
        for (int i = 0; i < json.length(); i++) {
            JSONObject cidade = new JSONObject(json.getString(i));

            Cidade cidade1 = new Cidade();
            cidade1.setCd_cidade(cidade.getInt("cd_cidade"));
            cidade1.setNm_cidade(cidade.getString("ds_municipio"));
            cidade1.setSg_uf(cidade.getString("ds_uf"));

            Log.i("PESSOA ENCONTRADA: ", "ds_municipio=" + cidade.getString("ds_municipio").toUpperCase());
            listaDeCidades.add(cidade1);

        }

    } catch (IOException ex) {
        Logger.getLogger(ListResourceActivity.class.getName()).log(Level.SEVERE, null, ex);
    } catch (JSONException ex) {
        Logger.getLogger(ListResourceActivity.class.getName()).log(Level.SEVERE, null, ex);
    }

    return listaDeCidades;

}

//Depois de executada a chamada do serviço
@Override
protected void onPostExecute(List<Cidade> result) {
    super.onPostExecute(result);

    dialog.dismiss();

    if (result.size() > 0) {

        //Identifica o Spinner no layout
        comboCidades = (Spinner) findViewById(R.id.combo_cidade);

        listAdapterCidades = new ArrayAdapter<>(SearchActivity.this, android.R.layout.simple_spinner_item, result);

        ArrayAdapter<Cidade> spinnerArrayAdapter = listAdapterCidades;

        spinnerArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_item);

        comboCidades.setAdapter(spinnerArrayAdapter);

        comboCidades.setSelection(posicaoCidadeSelecionada);

        //Método do Spinner para capturar o item selecionado
        comboCidades.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {

            @Override
            public void onItemSelected(AdapterView<?> parent, View v, int posicao, long id) {

                posicaoCidadeSelecionada = posicao;

                //pega nome pela posição
                cidadeSelecionada = (Cidade) parent.getItemAtPosition(posicaoCidadeSelecionada);
                //imprime um Toast na tela com o nome que foi selecionado
                Toast.makeText(SearchActivity.this, "Cidade Selecionada: " + cidadeSelecionada.getNm_cidade(), Toast.LENGTH_SHORT).show();

            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {

            }

        });

    } else {
        AlertDialog.Builder builder = new AlertDialog.Builder(SearchActivity.this)
                .setTitle("Erro")
                .setMessage("Não foi possível acessar as informações!!")
                .setPositiveButton("OK", null);
        builder.create().show();
    }

}

}

identar texto pre-formatado em 4 espaços