دسته بندی ها
21:16 1399/08/21

ارسال اطلاعات به صورت غیر همزمان (Async) در اندروید

مشخصات سوال کننده :
کاربر : Mahdi76     امتیاز کاربر : 2     رتبه کاربر : 145
دسته بندی : Android

به این سوال امتیاز بدهید    1
تعداد بازدید این سوال : 3929
هوش مصنوعی

پاسخ هوش مصنوعی

برای ارسال اطلاعات به وب سرویس، می توانید سطرها را به فرمت JSON تبدیل کرده و به صورت یکجا به API ارسال کنید. این بهینه تر است زیرا تعداد درخواست ها را کاهش می دهد و باعث بهبود عملکرد می شود. پس اولین مرحله تبدیل داده ها به JSON است.

برای ارسال درخواست ها به صورت غیر همزمان و به ترتیب، می توانید از کال بک ها (callbacks) یا Future و CompletableFuture در اندروید استفاده کنید. در این مثال، از okhttp و کال بک ها برای مدیریت درخواست ها استفاده خواهیم کرد.

در زیر یک مثال ساده از نحوه استفاده از okhttp برای ارسال درخواست به صورت غیر همزمان آورده ام:


import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.MediaType;
import okhttp3.RequestBody;

import org.json.JSONArray;
import org.json.JSONObject;

import java.io.IOException;

public class Example {

    private OkHttpClient client = new OkHttpClient();

    public void sendJsonData() {
        // فرض کنید که این داده ها از دیتابیس خوانده شده اند
        JSONArray jsonArray = new JSONArray();
        jsonArray.put(new JSONObject().put("key1", "value1"));
        jsonArray.put(new JSONObject().put("key2", "value2"));

        // آدرس وب سرویس
        String url = "https://yourapi.com/endpoint";
        
        RequestBody body = RequestBody.create(
                MediaType.parse("application/json"), 
                jsonArray.toString());

        Request request = new Request.Builder()
                .url(url)
                .post(body)
                .build();

        client.newCall(request).enqueue(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()) {
                    // پردازش جواب سرور
                    String responseData = response.body().string();
                    System.out.println(responseData);
                    // حالا میتوانید درخواست بعدی را ارسال کنید
                    sendNextRequest();
                }
            }
        });
    }

    private void sendNextRequest() {
        // کد برای ارسال درخواست بعدی
    }
}

در این کد، هنگامی که درخواست اول با موفقیت انجام شد، می توانید درخواست بعدی را ارسال کنید. بدین ترتیب به صورت زنجیره ای درخواست ها را ارسال می کنید و از پاسخ درخواست قبلی قبل از ارسال بعدی استفاده می کنید.

همچنین توجه داشته باشید که اگر شما نیاز به ارسال چند درخواست Sequential (به ترتیب) دارید، مطمین شوید هر درخواست بعد از دریافت پاسخ درخواست قبلی ارسال شود.

به این پاسخ امتیاز بدهید    0
امتیاز: - رتبه: -
پاسخ دهنده : hamid_b 13:16 1399/08/22

معمولا Web Service نتیجه رو به صورت Json برمیگردونه. چون خروجی جیسون یک خروجی استاندارد هست که برای همه Device ها و اپلیکیشن ها قابل دریافت و قابل فهم هست. شما باید کل اطلاعاتی رو که میخواید از طریق وب سرویس ارسال کنید از دیتابیس بخونید و همه رو در قالب جیسون ارسال کنید. به مثال زیر دقت کنید

 

HttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(
    "https://api.dailymile.com/entries.json?oauth_token="
    + token);

httpPost.setHeader("content-type", "application/json");
JSONObject data = new JSONObject();

data.put("message", dailyMilePost.getMessage());
JSONObject workoutData = new JSONObject();
data.put("workout", workoutData);
workoutData.put("activity_type", dailyMilePost.getActivityType());
workoutData.put("completed_at", dailyMilePost.getCompletedAt());
JSONObject distanceData = new JSONObject();
workoutData.put("distance", distanceData);
distanceData.put("value", dailyMilePost.getDistanceValue());
distanceData.put("units", dailyMilePost.getDistanceUnits());
workoutData.put("duration", dailyMilePost.getDurationInSeconds());
workoutData.put("title", dailyMilePost.getTitle());
workoutData.put("felt", dailyMilePost.getFelt());

StringEntity entity = new StringEntity(data.toString(), HTTP.UTF_8);
httpPost.setEntity(entity);

HttpResponse response = httpClient.execute(httpPost);

 

ارسال اطلاعات به Server به صورت Async در اندروید

برای ارسال اطلاعات به صورت ناهمزمان بهتره کلاس خودتون رو به صورت Async تعریف کنید. مثال های زیادی توی اینترنت برای این کار هست

 

class AsynTask extends AsyncTask<Void, Void, String>{}

 

به این پاسخ امتیاز بدهید    0
امتیاز: 518 رتبه: 4
پاسخ دهنده : nasscope 14:11 1400/04/09

در مورد AsyncTask و RxJava تحقیق کنید. البته AsyncTask از اندروید 11 دیگه Deprecate شده و گوگل پیشنهاد داده از کلاس خود جاوا استفاده بشه. توضیحات سایت Developer اندروید رو بررسی کنید:

Developer

ویرایش شده در پنج شنبه 10 تیر 1400 ساعت 10:34:46
به این پاسخ امتیاز بدهید    0
امتیاز: 0 رتبه: 7063
برای ارسال پاسخ لطفا وارد حساب کاربری خود شوید.   ورود