我有一个函数,我必须从服务器获取代码并返回它的操作。
这是代码
public String getResult
{
// Call to your backend
try {
String url = String.format(Constants.LOGIN_URL,
URLEncoder.encode(countryCode + phoneNumber, "UTF-8"),
URLEncoder.encode(smsCode, "UTF-8"),
URLEncoder.encode(Constants.WHERE_API_KEY, "UTF-8"));
while (new LoginToServer().execute(url).get());
}catch (Exception e)
{}
return result; // Result will be saved to class in onPostExecute()如果检索结果时出错,我的LoginToServer将返回true。现在,这将最明显地删除NetworkOnMainThread的例外,但是它会阻塞UI。
由于函数将由一些sdks调用,所以我必须使httpconnection完成,然后传递结果。
在执行此代码时,如何使UI解除阻塞?
同样,我不能以aysnc的形式调用整个函数,因为大多数sdk函数将在内部调用该函数,而且它们在异步中将不进行调用。
发布于 2015-03-22 15:08:02
您必须使用类似于AsyncTask的东西。当然,您可以从SDK/库的用户中抽象出来,这样他们就可以简单地调用一个doLogin()函数,并在该函数中传递一个回调接口,当登录结果返回时将被调用。
public void doLogin(final MyCallback callback) {
new AsyncTask<URL, Void, Boolean> {
protected Boolean doInBackground(URL... urls) {
// make network calls to login in this "background" thread.
loginSuccess = true;
return loginSuccess;
}
protected void onPostExecute(Boolean loginSuccess) {
callback.onResult(loginSuccess);
}
}.execute();
}注意这个doLogin方法是如何立即返回的,并且只有在网络调用完成后(也许几秒钟后)才会调用callback。这是您如何做非阻塞工作,并保持主线程和应用程序UI响应。
发布于 2015-03-22 14:57:21
在执行此代码时,如何使UI解除阻塞?
去掉get(),并在onPostExecute()中处理AsyncTask的URL结果。
或者,用常规线程替换AsyncTask,并在后台线程上调用getResult(),并在它们之间使用适当的同步逻辑。这将是浪费,因为您不应该需要两个线程在这里,但它得到的主要应用程序线程的混合。
对于阻塞调用,您不能在主应用程序线程上调用getResult(),而且阻塞调用在某种程度上不会阻塞。
发布于 2015-03-22 15:19:50
异步线程用于耗时的操作(网络可能是慢的/服务器可能是慢的/许多客户端服务器之间的跳数等等)。
在从服务器获取数据时,不阻止UI线程的工作,这就是异步调用的用途。
您可以通过Asyctasks ()方法调用这个函数。
UI线程将正常工作,进程将导致PostExecute()回调。
你所面临的挑战是什么?当然,有几个函数可以在异步中调用它。要同步异步调用吗?为此您可以使用执行者。
查看原生Android异步类或库(如LoopJ )
https://stackoverflow.com/questions/29195686
复制相似问题