- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用 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/
我正在实现 IMAP 客户端,但 IMAP 邮箱同步出现问题。 首先,可以从 IMAP 服务器获取新邮件,但我不知道如何从邮箱中查找已删除的邮件。 我是否应该从服务器获取所有消息并将其与本地数据进行比
我研究线程同步。当我有这个例子时: class A { public synchronized void methodA(){ } public synchronized void met
嗨,我做了一个扩展线程的东西,它添加了一个包含 IP 的对象。然后我创建了该线程的两个实例并启动它们。他们使用相同的列表。 我现在想使用 Synchronized 来阻止并发更新问题。但它不起作用,我
我正在尝试使用 FTP 定期将小数据文件从程序上传到服务器。用户从使用 javascript XMLHttpRequest 函数读取数据的网页访问数据。这一切似乎都有效,但我正在努力解决由 FTP 和
我不知道如何同步下一个代码: javascript: (function() { var s2 = document.createElement('script'); s2.src =
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 7 年前。 Improve this qu
一 点睛 1 Message 在基于 Message 的系统中,每一个 Event 也可以被称为 Message,Message 是对 Event 更高一个层级的抽象,每一个 Message 都有一个
一 点睛 1 Message 在基于 Message 的系统中,每一个 Event 也可以被称为 Message,Message 是对 Event 更高一个层级的抽象,每一个 Message 都有一个
目标:我所追求的是每次在数据库中添加某些内容时(在 $.ajax 到 Submit_to_db.php 之后),从数据库获取数据并刷新 main.php(通过 draw_polygon 更明显)。 所
我有一个重复动画,需要与其他一些 transient 动画同步。重复动画是一条在屏幕上移动 4 秒的扫描线。当它经过下面的图像时,这些图像需要“闪烁”。 闪烁的图像可以根据用户的意愿来来去去和移动。它
我有 b 个块,每个块有 t 个线程。 我可以用 __syncthreads() 同步特定块中的线程。例如 __global__ void aFunction() { for(i=0;i #
我正在使用azure表查询来检索分配给用户的所有错误实体。 此外,我更改了实体的属性以声明该实体处于处理模式。 处理完实体后,我将从表中删除该实体。 当我进行并行测试时,可能会发生查询期间,一个实体已
我想知道 SQLite 是如何实现它的。它基于文件锁定吗?当然,并不是每个访问它的用户都锁定了整个数据库;那效率极低。它是基于多个文件还是仅基于一个大文件? 如果有人能够简要概述一下 sqlite 中
我想post到php,当id EmpAgree1时,然后它的post变量EmpAgree=1;当id为EmpAgree2时,则后置变量EmpAgree=2等。但只是读取i的最后一个值,为什么?以及如何
CUBLAS 文档提到我们在读取标量结果之前需要同步: “此外,少数返回标量结果的函数,例如 amax()、amin、asum()、rotg()、rotmg()、dot() 和 nrm2(),通过引用
我知道下面的代码中缺少一些内容,我的问题是关于 RemoteImplementation 中的同步机制。我还了解到该网站和其他网站上有几个关于 RMI 和同步的问题;我在这里寻找明确的确认/矛盾。 我
我不太确定如何解决这个问题......所以我可能需要几次尝试才能正确回答这个问题。我有一个用于缓存方法结果的注释。我的代码目前是一个私有(private)分支,但我正在处理的部分从这里开始: http
我对 Java 非常失望,因为它不允许以下代码尽可能地并发移动。当没有同步时,两个线程会更频繁地切换,但是当尝试访问同步方法时,在第二个线程获得锁之前以及在第一个线程获得锁之前再次花费太长时间(比如
过去几周我一直在研究java多线程。我了解了synchronized,并理解synchronized避免了多个线程同时访问相同的属性。我编写此代码是为了在同一线程中运行两个线程。 val gate =
我有一个关于 Java 同步的简单问题。 请假设以下代码: public class Test { private String address; private int age;
我是一名优秀的程序员,十分优秀!