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

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

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

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

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

Ответы [ 5 ]

1 голос
/ 25 июля 2012

У меня была такая же проблема, и я решил ее, вызвав запрос ajax для события «deviceready», инициированного phonegap.

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

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

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

1 голос
/ 23 февраля 2012

Сегодня столкнулся с той же проблемой. Решил это, используя setTimeout с задержкой 10 мс.

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

1 голос
/ 17 мая 2011

Можете ли вы получить свой 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;
            }
        }

    }

}
0 голосов
/ 26 сентября 2013

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

 $(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");
       }
            });

     });
0 голосов
/ 11 июня 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...