Penso che ciò che si vuole fare è qualcosa di simile:
public class MyActivity extends Activity implements Callback , View.OnClickListener {
@Override
public void onCreate(Bundle savedState) {
super.onCreate(savedState);
findViewById(R.id.DoHttp).setOnClickListener(this);
}
@Override
public void onClick(View v) {
if (v.getId(() == R.id.DoHttp) {
OkHttpClient okHttpClient = new OkHttpClient();
Request request = new Request.Builder().url("http://publicobject.com/helloworld.txt").build();
okHttpClient.newCall(request).enqueue(this);
}
}
@Override
public void onFailure(Request request, IOException e) {
//do something to indicate error
}
@Override
public void onResponse(Response response) throws IOException {
if (response.isSuccessful()) {
parse(response.body().string());
}
}
private void parse(String response) {
//do something with response
}
}
Nell'attività di cui sopra implementiamo Richiamata e poi quando creiamo la richiesta okhttp, passiamo esso un esempio di noi stessi (questo) e in questo modo possiamo ottenere oktthp per richiamare la classe, avremmo potuto fare una classe interna con la stessa facilità, ma questo riduce il numero di classi che dobbiamo fare. Ho usato un clic del pulsante per illustrare quando viene effettuata la chiamata Http, ma potrebbe essere un'altra volta, ad esempio potrebbe accadere quando lo schermo viene creato per la prima volta (in onCreate). Fai attenzione però alle rotazioni dello schermo. Anche questo presuppone che la callback sia fatta sul thread principale che penso sarebbe, ma non sono positivo dato che uso okttp in modo diverso da te. Se non restituisce i risultati sulla risposta sul thread principale, puoi chiamare runOnUiThread() e passargli un Runnable che esegue il lavoro di aggiornamento delle viste.
fonte
2015-06-30 20:34:03
Sono un po 'confuso di quello che stai cercando di fare qui. Se questo codice esiste in una funzione locale, allora a cosa serve fare un callback asincrono e memorizzare una variabile dichiarata nella funzione chiamante? Non saresti in grado di usarlo comunque a meno che non blocchi prima. È possibile memorizzare la risposta in una variabile di istanza di classe invece che funzionerebbe correttamente. Più che probabile se stai andando su questo nel modo sbagliato. –
@MattWolfe hai probabilmente ragione, io sono nuovo allo sviluppo Android. Quello che sto cercando di fare è ottenere alcuni dati come questo [collegamento] (https://hacker-news.firebaseio.com/v0/topstories.json), salvarlo in una variabile, analizzarlo e quindi visualizzarlo sullo schermo usando una vista. La memorizzazione dei dati in una variabile di istanza sarebbe il modo giusto per farlo o c'è un altro modo? Grazie. –
Avrei solo il tuo attrezzo attività/frammento Richiamata: Quindi fare: okHttpClient.newCall (request) .enqueue (this); Quindi nella tua risposta onResponse si può visualizzare i risultati sullo schermo. –