我正在使用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);
}
答案 0 :(得分:0)
call.enqueue(...)
中的回调将异步执行。这意味着它可以在将来的任意时间调用。
这意味着您的代码正在执行的操作:
selectAllFrom
call.enqueue(...)
list
allItems
addToList
这只是尝试同步使用异步资源的情况。它实际上是一种竞争条件,因为在调用另一个值的selectAllFrom
时可能会调用异步回调,因为它使用共享的myList
,导致错误的答案。
当使用异步资源(如Retrofit的调用)时,您需要等待一个值(call.execute()
)并处理它冻结UI或完全提交异步处理方式的事实。
编辑:还要注意Android对线程和操纵UI有严格的要求。回调中的Toast.makeText()
可能会导致异常,因为回调没有在UI线程上执行。