【问题标题】:Making JSON requests at the same time同时发出 JSON 请求
【发布时间】:2019-04-23 11:34:48
【问题描述】:

我想从多个库存 JSON 数据中获取数据,但我知道如何一次只获取一个。 我找不到获得几个的方法。 如果我只请求 AAPPL,它就可以工作,但如果我也请求 FB,它就不行

有关我从中获取数据的 API 的更多信息: https://financialmodelingprep.com/developer/docs#Realtime-Stock-Price

我尝试添加更多股票 final String stockID = "AAPL,FB";

在浏览器中显示数据 https://financialmodelingprep.com/api/company/price/AAPL,FB?datatype=json 但不在应用程序中。

public class MainActivity extends AppCompatActivity {
ListView textView;
ArrayList<String> stocks;//is a resizable array
ArrayAdapter<String> adapter; //Returns a view for each object in a collection of data objects you provide
    RequestQueue queue; //Cola peticiones volley

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = findViewById(R.id.textView);
       queue = Volley.newRequestQueue(this); //Creamos una requestqueue para que gestione hilos, peticiones y demas.
        stocks = new ArrayList<>();
        adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, stocks); //Pasing the context, the row layout  and the resource?
        textView.setAdapter(adapter); //Setting to the listview the arrayadapter that returns the view from the arraylist
        addstock();

    }
//TODO: add the rest of the stocks
    private void addstock() {
        final String stockID = "AAPL";
        final String stockName = "Apple";






        String url = "https://financialmodelingprep.com/api/company/price/" +stockID+"?datatype=json";

        //Making the request
        JsonObjectRequest jsonObjectRequest = new JsonObjectRequest
                (Request.Method.GET, url, null, new Response.Listener<JSONObject>() {

                    @Override
                    public void onResponse(JSONObject response) {
                        try{

                            JSONObject value = response.getJSONObject(stockID);

                            String price = value.getString("price");
                            String Linestock = stockName+ ":"+price+"$";
                            stocks.add(Linestock);//Adding it to the arraylist
                            adapter.notifyDataSetChanged(); //And to the view
                        } catch (Exception e){

                        }
                    }
                }, new Response.ErrorListener() {

                    @Override
                    public void onErrorResponse(VolleyError error) {
                        // TODO: Handle error

                    }

                });
            queue.add(jsonObjectRequest);
    }
}

【问题讨论】:

  • 问题不清楚,至少对我来说是这样
  • 您能否更新代码以显示您如何处理多个 stockIDs?如果您只是将stockID 设置为AAPL,FB,则response.getJSONObject(stockID) 行将不起作用,因为AAPL,FB 没有对象,并且空指针异常将被您的空catch 块捕获并吞下。

标签: java android json parsing


【解决方案1】:

您可以使您的请求异步。 为此,您可以查看此tutorial


我个人使用 okhttp3 包。 有了这个,你可以构建一个这样的函数:

public static String performPostCall(String requestURL, JSONObject postDataParams, String auth)
{
    String response;

    Log.d(LOG_TAG, "Send: " + postDataParams.toString() + " to " + requestURL + " Auth: " + auth);

    try
    {
        Request request;

        Builder tmp = new Builder();

        tmp.connectTimeout(10, TimeUnit.SECONDS);
        tmp.readTimeout(30, TimeUnit.SECONDS);
        tmp.writeTimeout(30, TimeUnit.SECONDS);

        OkHttpClient client = tmp.build();

        MediaType mediaType = MediaType.parse("application/json");
        RequestBody body = RequestBody.create(mediaType, postDataParams.toString());

        if (auth.equals(""))
        {
            request = new Request.Builder().url(requestURL).post(body).addHeader("Accept", "application/json").addHeader("Content-Type", "application/json").build();
        }
        else
        {
            request = new Request.Builder().url(requestURL).post(body).addHeader("Accept", "application/json").addHeader("Content-Type", "application/json").addHeader("authorization", "Bearer " + auth).build();
        }

        Response recv = client.newCall(request).execute();
        response = recv.body().string();
    }
    catch (Exception e)
    {
        response = "{\"api_version\":1,\"status\":-1}";

        Log.e(LOG_TAG, e.getMessage());
    }

    Log.d(LOG_TAG, "Received: " + response);

    return response;
}

【讨论】:

  • 您好,上面提到的API支持传递多个股票代码,因此可以通过单个请求来实现。
【解决方案2】:

如果您只是将stockID 设置为AAPL,FB

response.getJSONObject(stockID) 

不起作用,因为AAPL,FB 没有对象,并且空指针异常将被您的空 catch 块捕获并吞下。

 try{

    String[] stockIDs = stockID.Split(","); // assuming stockID is the full string you passed to the API. i.e "AAPL,FB" so we have to get individual stocks.

    for(int i= 0; i < stockIDs.size; i++) { 
        JSONObject value = response.getJSONObject(stockIDs[i]);

        String price = value.getString("price");
        String Linestock = stockName+ ":"+price+"$";
        stocks.add(Linestock);//Adding it to the arraylist
     }
     adapter.notifyDataSetChanged(); //And to the view

} catch (Exception e){
  // Log.e(....); so you see the error on LogCat atleast
}

您还可以迭代 JSON 对象的属性,而不管您传递给 API 的属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多