Android - ArrayList大小始终返回0

时间:2016-12-10 16:17:01

标签: java android arraylist

我正在使用Google地图并进行改造并将其添加到列表中。我想收集列表中的所有地方,我在下面做了,但是[R S] = meshgrid(-5:0.1:5, -5:0.1:5); figure contour(R, S, R.^2 + S.^2, 5); axis([-5,5,-5,5]) axis square hold on % Create a scatter plot and store the graphics handle so we can update later hscatter = scatter(NaN, NaN, 'fill'); for i=1:50 a = 0; b = 1:2 B = repmat(b,5,1) A = unifrnd(a,B) x = A(1:5,1); y = A(1:5,2); % Update the X and Y positions of the scatter plot set(hscatter, 'XData', x, 'YData', y); pause(0.5) end 列表大小总是返回0,我无法弄清楚为什么,我错过了什么?任何人都可以帮助我吗?

My Globals

allItem

按钮点击功能

ArrayList<MapData.ResultsBean> myList;
ArrayList<MapData.ResultsBean> allItems;

SelectAllFrom功能

 menuOption1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                myList = new ArrayList<MapData.ResultsBean>();
                allItems = new ArrayList<MapData.ResultsBean>();

                allItems.addAll(selectAllFrom("restaurant", myList));
                allItems.addAll(selectAllFrom("cafe", myList));
                allItems.addAll(selectAllFrom("bar", myList));

                Log.v("Size", "Places List size : " + allItems.size() + "");
            }
        });

最后,这是我的addToList函数

private ArrayList<MapData.ResultsBean> selectAllFrom(final String type, final ArrayList<MapData.ResultsBean> list) {

        // Creating an object of our api interface
        ApiService myApi = RetroClient.getApiService();

        // Calling JSON
        Call<MapData> call = myApi.getNearbyPlaces(type, mLastLocation.getLatitude() + "," + mLastLocation.getLongitude(), PROXIMITY_RADIUS);

        call.enqueue(new Callback<MapData>() {
            @Override
            public void onResponse(Call<MapData> call, Response<MapData> response) {

                Log.v("Response Code", "Response Code is : " + response.code());

                if (response.isSuccessful()){

                    try {
                        // This loop will go through all the results
                        for (int i = 0; i < response.body().getResults().size(); i++) {
                            addToList(list, response.body().getResults().get(i));
                        }

                        Log.v(type, "List Size : " + list.size() + "");

                    } catch (Exception e) {
                        Log.d("onResponse", "There is an error");
                        e.printStackTrace();
                    }

                } else {
                    Toast.makeText(getApplicationContext(), "Something work wrong", Toast.LENGTH_LONG).show();
                }

            }

            @Override
            public void onFailure(Call<MapData> call, Throwable t) {

                Toast.makeText(getApplicationContext(), "On Failure", Toast.LENGTH_LONG).show();
            }
        });


        return  list;

    }

这是我的logcat,allItem大小总是返回0

void addToList(ArrayList<MapData.ResultsBean> myList, MapData.ResultsBean item){
    if(!myList.contains(item))
        myList.add(item);
}

1 个答案:

答案 0 :(得分:0)

call.enqueue(...)中的回调将异步执行。这意味着它可以在将来的任意时间调用。

这意味着您的代码正在执行的操作:

  • 致电selectAllFrom
  • 致电call.enqueue(...)
  • 返回此时仍为空的list
  • 将空列表添加到allItems
  • [稍后某点]在回调中调用addToList

这只是尝试同步使用异步资源的情况。它实际上是一种竞争条件,因为在调用另一个值的selectAllFrom时可能会调用异步回调,因为它使用共享的myList,导致错误的答案。

当使用异步资源(如Retrofit的调用)时,您需要等待一个值(call.execute())并处理它冻结UI或完全提交异步处理方式的事实。

编辑:还要注意Android对线程和操纵UI有严格的要求。回调中的Toast.makeText()可能会导致异常,因为回调没有在UI线程上执行。