gpt4 book ai didi

Android 测试 - 如何同步 AsyncTask

转载 作者:太空狗 更新时间:2023-10-29 14:16:20 25 4
gpt4 key购买 nike

我正在使用 foursquare API 制作一个简单的 Venues 应用程序。在 Activity 中,我有一个按钮,当单击该按钮时,AsyncTask 中的 HTTP GET 将成为一项服务,以获取用户当前位置周围的趋势场所。如果 GET 成功,则包含带有结果的 ListView 的 fragment 将添加到 Activity 中。

我想测试单击按钮后是否创建了 fragment 。问题是 AsyncTask 正在另一个线程中运行,并且测试以失败的断言结束。

代码如下:

public void testBtnFindVenues_clickShouldInstantiateVenueListFragment() {
TouchUtils.clickView(this, this.btnFindVenues);
assertNotNull("VenueListFragment is null", this.getVenueListFragment());
}

private Fragment getVenueListFragment() {
FragmentManager fragmentManager = this.activity
.getSupportFragmentManager();
VenueListFragment venueListFragment = (VenueListFragment) fragmentManager
.findFragmentByTag(this.activity
.getString(R.string.fragment_tag_venue_list));

return venueListFragment;
}

如何在执行 AsyncTask 后执行断言

编辑:这是 AsyncTask

protected class HttpGetJsonTask extends AsyncTask<Void, Void, ResponsePair> {
private String requestUrl;
private IOnSuccess onSuccess;
private IOnError onError;

public HttpGetJsonTask(String requestUrl) {
this.requestUrl = requestUrl;
}

public void setOnSuccess(IOnSuccess onSuccess) {
this.onSuccess = onSuccess;
}

public void setOnError(IOnError onError) {
this.onError = onError;
}

@Override
protected ResponsePair doInBackground(Void... params) {
HttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet(this.requestUrl);
get.addHeader("content-type", "application/json");

ResponsePair responsePair = new ResponsePair();

try {
HttpResponse response = client.execute(get);
String jsonData = HttpRequester.this
.getResponseContentAsString(response);
int statusCode = response.getStatusLine().getStatusCode();

responsePair.setJsonData(jsonData);
responsePair.setStatusCode(statusCode);

return responsePair;
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

return responsePair;
}

@Override
protected void onPostExecute(ResponsePair responsePair) {
super.onPostExecute(responsePair);

HttpRequester.this.executeEvents(this.onSuccess, this.onError,
responsePair);
}
}

private void executeEvents(IOnSuccess onSuccess, IOnError onError,
ResponsePair responsePair) {
String jsonData = responsePair.getJsonData();
int statusCode = responsePair.getStatusCode();

if (statusCode / 100 == 4 || statusCode / 100 == 5 || statusCode == 0) {
onError.performAction(jsonData);
} else {
onSuccess.performAction(jsonData);
}
}

private String getResponseContentAsString(HttpResponse response) {
String stringContent = null;
InputStream inputStream = null;
InputStreamReader reader = null;
BufferedReader bufferedReader = null;

try {
inputStream = response.getEntity().getContent();
reader = new InputStreamReader(inputStream);
bufferedReader = new BufferedReader(reader);

StringBuilder stringContentBuilder = new StringBuilder();
String line = bufferedReader.readLine();

while (line != null) {
stringContentBuilder.append(line);
line = bufferedReader.readLine();
}

stringContent = stringContentBuilder.toString();
} catch (IOException ex) {
ex.printStackTrace();
} finally {
try {
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}

return stringContent;
}

这里是按钮的设置和 VenueListFragment 的交易

private void setUpBtnFindVenues() {
this.btnFindVenues = (Button) this.findViewById(R.id.btn_findVenues);
this.btnFindVenues.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (!NetworkUtils
.isNetworkConnectionEnabled(VenueListActivity.this)) {
MessageNotifier.displayMessage(VenueListActivity.this,
R.string.toast_network_connection_not_found);

return;
}

IOnSuccess onSuccess = new IOnSuccess() {
@Override
public void performAction(String data) {
int index = data.indexOf("{\"venues\"");

data = data.substring(index, data.length() - 1);
Gson gson = new Gson();
ResponseModel response = gson.fromJson(data,
ResponseModel.class);
VenueListActivity.this.venues = response.getVenues();

if (VenueListActivity.this.venues.size() == 0) {
MessageNotifier.displayMessage(
VenueListActivity.this,
R.string.toast_not_venues_within_radius);
}

VenueListActivity.this
.setUpVenueList(VenueListActivity.this.venues);
}
};

IOnError onError = new IOnError() {
@Override
public void performAction(String data) {
MessageNotifier.displayMessage(VenueListActivity.this,
R.string.toast_problem_on_server);
}
};

// Get the user's location
Location location = VenueListActivity.this.locationTracker
.getLocation();

if (location == null) {
MessageNotifier.displayMessage(VenueListActivity.this,
R.string.toast_location_not_found);
} else {
// Build the route parameters HashMap
Map<String, String> routeParams = new HashMap<String, String>();
double latitude = location.getLatitude();
double longitude = location.getLongitude();

Log.d("denis", "Latitude: " + Double.toString(latitude));
Log.d("denis", "Longitude: " + Double.toString(longitude));
routeParams.put("ll",
String.format("%s,%s", latitude, longitude));

int radius = (VenueListActivity.this.seekBarRadius
.getProgress() + MIN_RADIUS) * SEEK_BAR_PROGRESS_MULTIPLIER;
routeParams.put("radius", Integer.toString(radius));

AppUtils.getData().venues()
.getTrendingVenues(routeParams, onSuccess, onError);
}
}
});
}

private void setUpVenueList(List<VenueModel> venues) {
Gson gson = new Gson();

Bundle arguments = new Bundle();
arguments.putBoolean(BundleKey.IS_TWO_PANE, this.isTwoPane);
arguments.putString(BundleKey.VENUES, gson.toJson(venues));

VenueListFragment fragment = new VenueListFragment();
fragment.setArguments(arguments);

FragmentManager fragmentManager = this.getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();

transaction.replace(R.id.frameLayout_venueListContainer, fragment,
this.getString(R.string.fragment_tag_venue_list));

transaction.commit();
}

这是DataUnitOfWork中的方法

public void getTrendingVenues(Map<String, String> routeParams,
IOnSuccess onSuccess, IOnError onError) {
if (!routeParams.containsKey("ll")) {
throw new IllegalArgumentException("The routeParams Map does not contain the \"ll\" route parameter (it is required)");
}

StringBuilder urlBuilder = new StringBuilder();
urlBuilder.append(this.rootUrl);
urlBuilder.append(String.format("%s%s", "trending", MainPersister.CLIENT_ROUTE_PARAMS));

Set<String> keys = routeParams.keySet();
for (String key : keys) {
urlBuilder.append(String.format("&%s=%s", key, routeParams.get(key)));
}

HttpGetJsonTask get = new HttpGetJsonTask(urlBuilder.toString());
get.setOnSuccess(onSuccess);
get.setOnError(onError);

get.execute();
}

最佳答案

doInBackground 在另一个线程上运行,但 onPostExecute 在调用线程上运行。确保在 AsyncTask 完成后填充 UI 的代码在 onPostExecute 方法中。

关于Android 测试 - 如何同步 AsyncTask,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21659223/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com