Как использовать асинхронную задачу для разных значений. Я кратко объясню свою проблему в описании - PullRequest
0 голосов
/ 01 июля 2019

enter image description here Я получаю восстановленные данные с сервера, используя залп и отображаю их в виде списка. Таким образом, я получу адрес клиента от сервера, и мне нужно рассчитать расстояние между текущим местоположением человека, который использует приложение, и адресом, который я получил от сервера. Я получу адрес другого клиента, и мне нужно рассчитать все их расстояния и отображать отдельно в виде списка вместе с именем клиента. Итак, я использую следующий код. Я получаю одинаковое расстояние для всех клиентов, как показано на изображении. Есть места, чем, Дели, Калян. Мне нужно рассчитать расстояние от текущего местоположения до тех мест. Я не понимаю, в чем проблема. код для расчета расстояния с использованием AyncTask. этот код находится внутри фрагмента.

public class getLocationFromNameAsync extends 
  AsyncTask<String  ,String,Double> {
    Context context;
    onTaskCompleted completed;

    public getLocationFromNameAsync(Context context) {
        this.context = context;
        this.completed = (onTaskCompleted) context;
    }

    @Override
    protected Double doInBackground(String... strings) {
        Geocoder coder = new Geocoder(getActivity());

        List<Address> address1=null;
        List<Address> addresses = null;

        try {
            address1 = coder.getFromLocationName(district, 5);
        } catch (IOException e) {
            e.printStackTrace();
        }
        if (address1 == null) {
            Toast.makeText(getActivity(), "Fetching Location,Please wait", Toast.LENGTH_SHORT).show();
            progressBar.setVisibility(View.INVISIBLE);
        }
        final Address location11 = address1.get(0);
        location11.getLatitude();
        location11.getLongitude();
        if (checkPermission()) {
            LocationManager locationManager=(LocationManager) getContext().getSystemService(Context.LOCATION_SERVICE);
            Location location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);

            Location location1 = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);

            Location location2 = locationManager.getLastKnownLocation(LocationManager.PASSIVE_PROVIDER);

            if (location != null) {
                latti = location.getLatitude();
                longi = location.getLongitude();
            } else if (location1 != null) {
                latti = location1.getLatitude();
                longi = location1.getLongitude();
            } else if (location2 != null) {
                latti = location2.getLatitude();
                longi = location2.getLongitude();
            }
            coder = new Geocoder(getActivity(), Locale.getDefault());

            try {
                addresses = coder.getFromLocation(latti, longi, 1);
                if (addresses != null && addresses.size() > 0) {
                    String address = addresses.get(0).getAddressLine(0);
                    area = addresses.get(0).getLocality();
                    String city = addresses.get(0).getAdminArea();
                    String county = addresses.get(0).getCountryName();
                    String postal_code = addresses.get(0).getPostalCode();
                    fullAddress=address+","+area+","+city+","+county+","+postal_code;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        LatLng source = new LatLng(latti, longi);

        LatLng destination = new LatLng(location11.getLatitude(), location11.getLongitude());
        double dis= SphericalUtil.computeDistanceBetween(source,destination);
        dis/=1000;
        return dis;
    }

    @Override
    protected void onPostExecute(Double aDouble) {
       completed.onTaskComplete(aDouble);
    }
}

мой код интерфейса.

public interface onTaskCompleted {
public void onTaskComplete(Double result);
}

NavigationDrawerActivity code. В этом задании я получаю результат.

public class navigationDrawer extends AppCompatActivity
    implements NavigationView.OnNavigationItemSelectedListener ,onTaskCompleted{
  static double distance;
 @Override
public void onTaskComplete(Double result) {
    distance=result;

    Toast.makeText(getApplicationContext(),"result is "+result,Toast.LENGTH_SHORT).show();
}

}

Получение данных из API и настройка данных в listView

StringRequest stringRequest = new StringRequest(Request.Method.POST, getTaskUrl,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    arrayList.clear();
                    try {
                        JSONObject jo = new JSONObject(response);
                        JSONArray ja = jo.getJSONArray("dataObj");
                        int length=ja.length();

                        for(int i=0; i<length; i++){
                            JSONObject temp = ja.getJSONObject(i);
                           nameC= temp.getString("name");
                           checkId=temp.getString("clientEid");
                           clientName=temp.getString("client");
                           candidateFatherName=temp.getString("fatherName");
                           clientProcess=temp.getString("otherId");
                            dueDate=temp.getString("deadline");
                            JSONArray jsaDate = temp.getJSONArray("updateDetails");
                            for(int k=0; k<jsaDate.length(); k++){
                                JSONObject jo1 = jsaDate.getJSONObject(k);
                                sentDate = jo1.getString("date");
                            }

                            JSONArray ja1 = temp.getJSONArray("address");
                            for(int j=0; j<ja1.length(); j++){
                                JSONObject jo1 = ja1.getJSONObject(j);
                                landmark=jo1.getString("landmark");
                                district= jo1.getString("district");
                                userAddrss=jo1.getString("full");

                                Geocoder coder = new Geocoder(getActivity());
                                       new getLocationFromNameAsync(getContext()).execute(district);

                                arrayList.add(new DataModel(nameC,district,landmark,checkId,Math.floor((navigationDrawer.distance*100)/100),clientName,candidateFatherName,clientProcess,sentDate,dueDate));
                            }
                        }

1 Ответ

0 голосов
/ 05 июля 2019

@ MarconVasconcelos говорит, что вам нужно перебрать все элементы вашего списка, и для каждого из них применить полученный ответ

...