2015-06-30 17 views
6

Bu benim kodudur: Yukarıdaki koddaAndroid Okunduğumu kullanarak geri arama yanıt dizesinden nasıl alınır?

OkHttpClient okHttpClient = new OkHttpClient(); 

    Request request = new Request.Builder().url("http://publicobject.com/helloworld.txt").build(); 

    Callback callback = new Callback() { 
     @Override 
     public void onFailure(Request request, IOException e) { 

     } 

     @Override 
     public void onResponse(Response response) throws IOException { 

     } 
    }; 

    okHttpClient.newCall(request).enqueue(callback); 

    String responseString; 

, I) (response.body değerini depolamak istediğiniz değişken responseString içinde onResponse() yönteminden dizeyi(), ancak ben can'. Erişim yap.

+1

Burada yapmaya çalıştığınız şey konusunda kafam karıştı. Bu kod yerel bir işlevde bulunuyorsa, eşzamanlı olmayan bir geri arama kullanmak ve arama işlevinde bildirilen bir değişkeni depolamak için ne işe yarar? İlk engellemediğiniz sürece bunu zaten kullanamazsınız. Yanıtı yerine bir sınıf örneği değişkeninde saklayabilirsiniz ve bu iyi çalışır. Büyük ihtimalle bu yanlış yöne gidiyorsun. –

+0

@MattWolfe muhtemelen haklısınız, Android geliştirme konusunda yeniyim. Yapmaya çalıştığım şey bu [link] gibi bazı verileri almak (https://hacker-news.firebaseio.com/v0/topstories.json), bir değişkene kaydetmek, ayrıştırmak ve ekranda görüntülemek Görünüm kullanarak. Bir örnek değişkeninde veri saklamak, bunu yapmak için doğru yol mu yoksa başka bir yol var mı? Teşekkür ederim. –

+0

Sadece sizin aktivite/parça uygulamanızı alırdım Geri arama: Yaparsanız: okHttpClient.newCall (istek) .enqueue (this); Ardından, onResponse uygulamasında onu ayrıştırın ve sonuçları ekrana gösterebilirsiniz. –

cevap

4

böyle bir şeydir atamaktır Kendimize bir örnek (bu) ve bu şekilde sınıfı geri çağırmak için oktthp'u alabildiğimiz gibi, kolayca bir iç sınıf yapabilirdik ama bu, yapmamız gereken sınıfların sayısını azaltıyor. Http çağrısının ne zaman yapıldığını göstermek için bir düğme tıklattım, ancak başka bir zaman olabilir, örneğin ekran ilk oluşturulduğunda (onCreate'da) olabilir. Ekran rotasyonlarına rağmen dikkatli olun. Ayrıca bu, geri dönüşün sanırım olacağını düşündüğüm ana konu üzerinde yapıldığını varsayar ama okttp'u sizden farklı bir şekilde kullandığımdan olumlu değilim. Eğer ana iş parçacığı üzerindeki yanıtı döndürmezse, o zaman runOnUiThread() öğesini çağırabilir ve görüntülemeyi güncelleme işini yapan bir Runnable iletebilirsiniz.

+0

Kullanacağınız yukarıdaki yöntem, ekran rotasyonunun sağında her seferinde ağ çağrısını yürüteceği için kullanacak mı? –

+0

Bu, tek veya basit bir çözüm olmadan sık karşılaşılan bir sorundur. –

+0

https://medium.com/google-developers/making-loading-data-on-android-lifecycle-aware-897e12760832 –

2

Örnek değişken olarak responseString bildirimini hareket ettirirseniz, Callback ürününüzün değerini onResponse yöntemine atayabilirsiniz.

public class MyClass { 

    private String responseString; 

    // your class implementation 

} 

Ben aşağıda gerekli değişikliklerle yayınlanmıştır kodunu değiştirmiş:

OkHttpClient okHttpClient = new OkHttpClient(); 

Request request = new Request.Builder().url("http://publicobject.com/helloworld.txt").build(); 

Callback callback = new Callback() { 
    @Override 
    public void onFailure(Request request, IOException e) { 

    } 

    @Override 
    public void onResponse(Response response) throws IOException { 
     responseString = response.body().string(); 
    } 
}; 

okHttpClient.newCall(request).enqueue(callback); 
+0

Maalesef, son yanıt –

+0

'dan beri ResponseString içinde onResponse değerini değiştiremiyorum Hata için özür dilerim. Kodumu değiştirdim, ancak kullanışlı değilse onu kaldıracağım. –

+0

Teşekkürler. Kod çalışır, ancak responseString değeri güncellenmesi biraz zaman alır. –

1

İlk cevap yakındır, ancak yöntem onResponse son değişken veremezsiniz.

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 
    } 
} 

yukarıdaki etkinlikte biz geri arama uygulamak ve biz okhttp isteği oluşturduğunuzda, sonra biz geçmek: Çözüm final String[] responseString = new String[1]; yazıp responseString[0] = response.body().string(); Sana ne yapmak istediğini düşünüyorum

+0

Kodumu değiştirdikten sonra, https://gist.github.com/taimoor-ahmad/ef9515751294d80d460e java.lang olsun.NullPointerException: println, ileti dizisi içinde responseString [0] değerini kullanmaya çalıştığımda bir mesaja ihtiyaç duyar. –

+0

kodunda onResponse, henüz geri çağrılmadı, geri arama yürütmesinden sonra yazdırmanız gerekiyor – Tomek

İlgili konular