Как предотвратить замораживание приложения PhoneGap в Android при выполнении асинхронного вызова AJAX?

У меня есть приложение PhoneGap-Android, и я использую JQuery. Я выполняю вызов ASYNCHRONOUS AJAX, и во время разговора приложение просто зависает и ждет после завершения вызова AJAX (это в основном заметно при подключении по GSM).

Я бы это понял, если бы я выполнял синхронный запрос, но у меня есть:

$.ajax({type: 'POST',url: 'http://www.example.com', data: data,async:true,success:callback}); 

Кто-нибудь может помочь?

Сегодняшняя проблема. Решил его с помощью setTimeout с задержкой в ​​10 мс.

Не знаю, почему это работает, что страшно. Но работает.

Можете ли вы отключить вызов 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; } } } } 

У меня была та же проблема, и я решил это, вызвав запрос ajax на событие «deviceready», запущенное по телефонной запинке.

Я случайно прочитал учебник, в котором говорится, что запрос ajax можно отправить после правильной загрузки приложения. Сначала привяжите событие document deviceready и отправьте запрос ajax внутри обработчика события. Выполнение этого способа может решить проблему блокирующего интерфейса.

 function appReady(){ // do the ajax here } document.addEventListener("deviceready", appReady, false); 

Надеюсь, это также может решить вашу проблему.

Из документов Jquery:

Async Boolean Значение по умолчанию: true По умолчанию все запросы отправляются асинхронно (т.е. по умолчанию это значение равно true). Если вам нужны синхронные запросы, установите для этого параметра значение false. Кросс-доменные запросы и dataType: запросы «jsonp» не поддерживают синхронную работу. Обратите внимание, что синхронные запросы могут временно блокировать браузер, отключая любые действия, пока запрос активен.

Так как код телефонной книги работает на localhost, он будет междоменным. Если вы можете, сделайте запрос через GET вместо POST.

Попробуйте этот код:

  $(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"); } }); }); 
Intereting Posts
TimePicker час не обновляется после переключения на 24h Как получить кнопку «Далее» на экранной клавиатуре Android вместо кнопки «Go» в телефонной запинке Биллинг на Android-приложение Ошибка: этот предмет не может быть куплен. (Код ошибки: IAB-DPTL) JNI: Как получить размер jbyteArray Listview с заголовком и нижним колонтитулом Android: анимация анимации растрового изображения Проблема Eclipse при установке нового программного обеспечения Как называется маленький виджет с тремя точками внутри карты в андроиде? Как избежать этого оживленного ожидания? Как реализовать поиск карт Google по адресу в Android? Как подключить Android с MySQL с помощью драйвера Mysql JDBC Как можно запрограммировать время зарядки аккумулятора Android? Добавить пользовательский шрифт для полного приложения для Android Android Get Keys от preferences.xml Как использовать Android ProgressBar в детерминированном режиме?