场景非常简单我有一个数组pArray
,它在main函数中声明,因为它必须返回它,所以必须能够访问ti但是该数组会被填充到一个监听器函数中。
我无法在该函数内初始化它,因为它不是final
,如果我将它标记为最终,我就无法编辑它。
我尝试通过将其返回类型从void更改为success
来从String[][]
函数返回一些内容,但这是不允许的。
问题是我可以从监听器函数返回一些东西,以便在main函数内访问它,如果是,我将获得对返回对象的访问权限吗?
private String[][] GetGooglePlaces(List<NameValuePair>[] nameValuePairs) {
String[][] pArray = null;
try {
iGPlaceApi.getStreams(itemsPerPage, pageNumber * itemsPerPage, new Callback<mGooglePlacesApiResponse>() {
@Override
public void failure(RetrofitError retrofitError) {
//TODO
}
@Override
public void success(mGooglePlacesApiResponse obj, Response arg1) {
pArray = new String[obj.results.size()][4];
for (int i = 0; i < obj.results.size(); i++) {
mGooglePlaces.place place = obj.results.get(i);
pArray[i][0] = place.icon;
pArray[i][1] = place.name;
}
}
});
return pArray;
}
我不想将pArray
声明为全局变量字段,因为它在此函数之外并没有任何用途。
答案 0 :(得分:0)
getStreams可能会产生另一个线程,这就是你附加回调的原因。
它会产生另一个线程,因为它想要做一个长时间运行的操作,所以1它不会挂起主线程&amp; 2您可以向用户提供一些其他反馈,直到它返回答案(在其回调中)。
所以你不应该从这个方法获得返回值,你应该监听回调并做出适当的响应。 说你可以破解它 :
private String[][] GetGooglePlaces(List<NameValuePair>[] nameValuePairs) {
String[][] pArray = null;
CountDownLatch countDownLatch = new CountDownLatch(1); // Set up a latch
try {
iGPlaceApi.getStreams(itemsPerPage, pageNumber * itemsPerPage, new Callback<mGooglePlacesApiResponse>() {
@Override
public void failure(RetrofitError retrofitError) {
//TODO
}
@Override
public void success(mGooglePlacesApiResponse obj, Response arg1) {
pArray = new String[obj.results.size()][4];
for (int i = 0; i < obj.results.size(); i++) {
mGooglePlaces.place place = obj.results.get(i);
pArray[i][0] = place.icon;
pArray[i][1] = place.name;
}
countDownLatch.countDown(); // unlock the latch when you get your callback
}
});
try {
countDownLatch.await(30, TimeUnit.SECONDS); // make it wait before you return
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
return pArray;
}
注意如果您在主线程上运行此操作,则会使用ANR崩溃您的应用
你应该做的是处理这个不同寻常的
private void getGooglePlaces(GooglePlacesListener finishedListener) {
try {
iGPlaceApi.getStreams(itemsPerPage, pageNumber * itemsPerPage, new Callback<GooglePlacesApiResponse>() {
@Override
public void failure(RetrofitError retrofitError) {
finishedListener.onFailure();
}
@Override
public void success(mGooglePlacesApiResponse obj, Response arg1) {
String[][] pArray = new String[obj.results.size()][4];
for (int i = 0; i < obj.results.size(); i++) {
mGooglePlaces.place place = obj.results.get(i);
pArray[i][0] = place.icon;
pArray[i][1] = place.name;
}
finishedListener.onRetrieved(pArray);
}
});
}
public interface GooglePlacesListener {
void onRetrieved(String[][] places);
void onFailure();
}