我有PhoneGap-Android应用程序,我正在使用Jquery。我正在进行ASYNCHRONOUS AJAX调用,在通话期间,应用程序只是在AJAX通话结束后冻结并等待(在GSM连接时主要是明显的)。
我理解这一点,如果我要做同步请求,但我有:
$.ajax({type: 'POST',url: 'http://www.example.com', data: data,async:true,success:callback});
有人可以帮忙吗?
答案 0 :(得分:1)
你可以从主UI线程中获取AJAX调用吗?例如:
public class JsonParsingActivity extends Activity {
private static final String url = "http://search.twitter.com/search.json?q=javacodegeeks";
protected InitTask _initTask;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button button = (Button)findViewById(R.id.button1);
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
_initTask = new InitTask();
_initTask.execute( getApplicationContext() );
}
});
}
@Override
public void onStop() {
super.onStop();
_initTask.cancel(true);
}
protected class InitTask extends AsyncTask<Context, String, SearchResponse>
{
@Override
protected SearchResponse doInBackground( Context... params )
{
InputStream source = retrieveStream(url);
SearchResponse response = null;
if (source != null) {
Gson gson = new Gson();
Reader reader = new InputStreamReader(source);
try {
response = gson.fromJson(reader, SearchResponse.class);
publishProgress( response.query );
reader.close();
} catch (Exception e) {
Log.w(getClass().getSimpleName(), "Error: " + e.getMessage() + " for URL " + url);
}
}
if (!this.isCancelled()) {
return response;
} else {
return null;
}
}
@Override
protected void onProgressUpdate(String... s)
{
super.onProgressUpdate(s);
Toast.makeText(getApplicationContext(), s[0], Toast.LENGTH_SHORT).show();
}
@Override
protected void onPostExecute( SearchResponse response )
{
super.onPostExecute(response);
StringBuilder builder = new StringBuilder();
if (response != null) {
String delim = "* ";
List<Result> results = response.results;
for (Result result : results) {
builder.append(delim).append(result.fromUser);
delim="\n* ";
}
}
if (builder.length() > 0) {
Toast.makeText(getApplicationContext(), builder.toString(), Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(getApplicationContext(), "The response was empty.", Toast.LENGTH_SHORT).show();
}
}
@Override
protected void onCancelled() {
super.onCancelled();
Toast.makeText(getApplicationContext(), "The operation was cancelled.", 1).show();
}
private InputStream retrieveStream(String url) {
DefaultHttpClient client = new DefaultHttpClient();
HttpGet getRequest;
try {
getRequest = new HttpGet(url);
HttpResponse getResponse = client.execute(getRequest);
HttpEntity getResponseEntity = getResponse.getEntity();
return getResponseEntity.getContent();
} catch (Exception e) {
Log.w(getClass().getSimpleName(), "Error for URL " + url, e);
return null;
}
}
}
}
答案 1 :(得分:1)
今天遇到同样的问题。通过使用延迟10ms的setTimeout解决了这个问题。
不确定为什么会这样,这很可怕。但确实有效。
答案 2 :(得分:1)
我遇到了同样的问题,我通过在phonegap触发的“deviceready”事件上调用ajax请求来解决这个问题。
我偶然阅读了一篇教程here,其中说明在正确加载应用程序后可以发送ajax请求。首先绑定到document deviceready事件并在事件处理程序中发送ajax请求。这样做可以解决阻塞UI问题。
function appReady(){
// do the ajax here
}
document.addEventListener("deviceready", appReady, false);
我希望这也可以解决您的问题。
答案 3 :(得分:0)
来自Jquery文档:
异步 布尔 默认值:true 默认情况下,所有请求都是异步发送的(默认设置为true)。如果需要同步请求,请将此选项设置为false。跨域请求和dataType:“jsonp”请求不支持同步操作。请注意,同步请求可能会暂时锁定浏览器,并在请求处于活动状态时禁用任何操作。
由于phonegap代码在localhost上运行,因此它将是跨域的。如果可以,请通过GET而不是POST来请求。
答案 4 :(得分:0)
试试这段代码:
$(document).ready(function () {
$.ajax({
type: "POST",
url: "https://demo.yoursuppliernetwork.com/tnvrs/userservice/login/checkUser",
data:{"username":login,"password":password},
dataType:"json",
contentType: "application/json; charset=utf-8",
success: function(html)
{
ss=html;
console.log(ss);
document.write("success");
},
error:function(error)
{
console.log(error.status)
document.write("error");
},
complete:function(html){
console.log()
document.write("complete");
}
});
});