java - 如何在android中的onResponse方法之外访问响应值

标签 java android asynchronous android-volley

我正在开发一个 Android 项目。我从 google api 得到了响应并解析了 json。但我想返回 onResponse 方法之外的值,这对我来说现在似乎是不可能的。下面是我的代码,我已经看过这个answer这里。但我想要这个异步方法之外的值。是否可以访问该值。

更新 - 我已更新我的代码以获取更多详细信息。这是我的完整 Activity 课。你可以看到我想要实现的目标。请帮助我如何在方法 parseJson 内的方法 get_time_to_travel 中访问 Volley onResponse 返回的值。现在这真是要了我的命。我的第一个 Android 项目,最近两天我被困在这里。

对此的任何帮助将不胜感激。

public class MainActivity extends AppCompatActivity {


    private RecyclerView recyclerView;
    private LinearLayoutManager linearLayoutManager;
    private CustomAdapter adapter;
    private List<UserData> userData;
    private LocationManager locationManager;
    private LocationListener locationListener;
    String origin, mode = "driving";
    private String API = "APIKey";
    TextView textView;
    RequestQueue requestQueue;
    RequestQueue requestQueue1;
    String url = "https://url/users";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        recyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
        recyclerView.setHasFixedSize(true);


        locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
        locationListener = new LocationListener() {
            @Override
            public void onLocationChanged(Location location) {
                double lat = location.getLatitude();
                double lng = location.getLongitude();
                origin = String.valueOf(lat)+","+String.valueOf(lng);
            }

            @Override
            public void onStatusChanged(String provider, int status, Bundle extras) {

            }

            @Override
            public void onProviderEnabled(String provider) {

            }

            @Override
            public void onProviderDisabled(String provider) {
                Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                startActivity(intent);
            }
        };
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                requestPermissions(new String[]{
                        Manifest.permission.ACCESS_FINE_LOCATION,
                        Manifest.permission.ACCESS_COARSE_LOCATION,
                        Manifest.permission.INTERNET
                }, 10);
            }
            return;
        }
        else{
            locationManager.requestLocationUpdates("gps", 5000, 0, locationListener);
        }


        getData();

        linearLayoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(linearLayoutManager);
        adapter = new CustomAdapter(this, userData);
        recyclerView.setAdapter(adapter);

    }

    private void getData(){
        userData = new ArrayList<>();
        requestQueue = Volley.newRequestQueue(this);

        JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(url,
                new Response.Listener<JSONArray>() {

                    @Override
                    public void onResponse(JSONArray response) {
                        parseJson(response);
                    }
                },

                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        Log.e("VOLLEY", "ERROR");
                    }
                }
        );
        requestQueue.add(jsonArrayRequest);
    }

    private void parseJson(JSONArray response){
        try {
            for (int i = 0; i < response.length(); i++) {
                JSONObject users = response.getJSONObject(i);

                String id = ("id: "+users.getString("id"));
                String name = ("Name: "+users.getString("name"));
                String username = ("Username: "+users.getString("username"));
                String email = ("Email: "+users.getString("email"));
                String address = parseAddress(users);
                String destination = parseCoordinates(users);
                String company = parseCompany(users);
                String phone = ("Phone: "+users.getString("phone"));
                String website = ("Website: "+users.getString("website"));
                String eta = get_time_to_travel(origin, destination, API, mode);

                UserData udata = new UserData(id, name, username, email, address, phone, website, company,eta);
                userData.add(udata);
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }


    private String parseAddress(JSONObject users) {
        JSONObject completeAdd = null;
        String address = null;
        try {
            completeAdd = users.getJSONObject("address");
            String street = completeAdd.getString("street");
            String suite = completeAdd.getString("suite");
            String city = completeAdd.getString("city");
            String zipcode = completeAdd.getString("zipcode");
            address = ("Address :" + street + ", " + suite + ", " + city + ", " + zipcode);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return address;
    }

    private String parseCoordinates(JSONObject users) {
        JSONObject completeAdd = null;
        String destination = null;
        try {
            completeAdd = users.getJSONObject("address");
            JSONObject coordinates = completeAdd.getJSONObject("geo");
            String latitude = coordinates.getString("lat");
            String longitude = coordinates.getString("lng");
            destination = latitude + "," + longitude;
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return destination;
    }

    private String parseCompany(JSONObject users) {
        JSONObject companyDetail = null;
        String company = null;
        try {
            companyDetail = users.getJSONObject("company");
            String company_name = companyDetail.getString("name");
            String catchPhrase = companyDetail.getString("catchPhrase");
            String bs = companyDetail.getString("bs");
            company = ("Company: " + company_name + ", " + catchPhrase + ", " + bs);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return company;
    }


    private String get_time_to_travel(String origin, String destination, String API, String mode){
        requestQueue1 = Volley.newRequestQueue(this);
        String eta = null;
        String google_api = "https://maps.googleapis.com/maps/api/distancematrix/json?origins="+origin+"&destinations="
                +destination+"s&mode="+mode+"&language=fr-FR&key="+API;
        JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST, google_api, null,
                new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject response) {
                        eta = parseGoogleData(response);
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        Log.e("VOLLEY", "ERROR");
                    }
                }

        );
        requestQueue1.add(jsonObjectRequest);
        return eta;
    }

    private String parseGoogleData(JSONObject response) {
        String estimated_time_arrival = null;
        try {
            JSONArray rows = response.getJSONArray("rows");

            JSONObject elements = rows.getJSONObject(0);
            JSONArray elementsArr = elements.getJSONArray("elements");

            JSONObject durationObj = elementsArr.getJSONObject(0);
            JSONObject durationData = durationObj.getJSONObject("duration");
            estimated_time_arrival = durationData.getString("text");

        } catch (JSONException e) {
            e.printStackTrace();
        }
        return estimated_time_arrival;
    }

}

最佳答案

异步任务正在其他线程上工作。因此,如果您想访问该方法之外的任何变量,您需要等到任务完成。否则该变量将为空。 例如: on on 响应方法

@Override
        public void onResponse(String response) {
            res=response;
            anyMethodtopassVar(DataType data);
        }

关于java - 如何在android中的onResponse方法之外访问响应值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41928314/

相关文章:

python - 发送 'websocket.send'后运行时错误: Unexpected ASGI message 'websocket.close' ,

ios - 从 Swift 函数中的异步调用返回数据

java - Java 中 double 的奇怪结果

java - Twilio sdk 不对应 api

android - 使用 Android mediaPlayer 播放原始文件夹中的文件,使用其 resourceId

java - 如何获取正确的外部 SDCard 位置

android - 如何在键盘 xml 中映射重音字符

javascript - 如何为异步加载的下拉列表分配唯一值

java - 关闭我的程序后如何保存对象变量?

java - Java中如何分割字符串?