استفاده از کتابخانه OkHttp در یک متد با مقدار برگشتی String
سلام. دوستان من بعد اینکه آموزش نوت رو دیدم.سعی کردم که ارتباط با اینترنت رو با استفاده از کتابخانه OkHttp انحام بدم. موفق هم شدم. اما الان سوالی برام پیش اومده. من برای استفاده از کتابخونه یک متد تعریف کردم که مقدار استرینگ رو بهم بر میگردونه. از طریق روش ناهمزمان و از طریق ترد UI از کتابخونه استفاده کردم. اما مشکل اینکه من بعد از اینکه درخواست ام رو اجرا می کنم و به خط برگرداندن string می رسم. مقدار null هست. برای حل این مشکل گفتم که اگر مقدارش null بود. 5 میلی ثانیه صبر کن و بعد دوباره چک کن. اگر null نبود. میره به خط return کردن string. کد درست هم کار میکنه. اما آیا روش بهتری هم هست؟یا اینکه آیا به صرفه هست که از این روش برم؟منظورم بخشی از کد هست که اگر استرینگ نال بود وایسه.ممنون
private static String string;
public static String startUrl(final String urlAddrass) {
Log.i("Log", "WebService is running");
OkHttpClient client = new OkHttpClient();
// 2
Request request = new Request.Builder()
.url(urlAddrass)
.build();
// 3
Callback callback = new Callback() {
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (!response.isSuccessful()) {
// manage error
Log.e("Log", "Unexpected code " + response);
return;
}
// show body content
string = response.body().string();
}
};
// 6
client.newCall(request).enqueue(callback);
while(string == null){
try {
Thread.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Log.i("Log" , "json: " + string);
return string;
}
نباید متغیر string رو خارج از onResponse ازش استفاده کنی.
با استفاده از interface یک callback میسازیم. callback در واقع همون عملکرد RxJava رو پیاده میکنه و برنامه غیرهمزمان میشه به اینصورت که میگیم هر زمان string آماده بود این متد رو اجرا کن.
public class HttpRequests{
public static String startUrl(final String urlAddrass,final HttpCallback httpCallback) {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(urlAddrass)
.build();
Callback callback = new Callback() {
@Override
public void onFailure(Call call, IOException e) {
e.printStac kTrace();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (!response.isSuccessful()) {
// manage error
Log.e("Log", "Unexpected code " + response);
return;
}
// show body content
String string = response.body().string();
Log.i("Log" , "json: " + string);
httpCallback.onSuccess(string);
}
};
client.newCall(request).enqueue(callback);
}
public interface HttpCallback {
public void onSuccess(String response);
}
}
حالا کافیه به شکل زیر درخواست رو هرجا نیاز داری انجام بدی:
HttpRequests.startUrl(urlAddrass, new HttpRequests.HttpCallback(){
@Override
public void onSuccess(String string) {
// string is ready to use ;)
}
});
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .