在进行异步AJAX调用时如何防止Android中的PhoneGap应用程序冻结?

时间:2011-05-17 04:33:29

标签: jquery android ajax asynchronous cordova

我有PhoneGap-Android应用程序,我正在使用Jquery。我正在进行ASYNCHRONOUS AJAX调用,在通话期间,应用程序只是在AJAX通话结束后冻结并等待(在GSM连接时主要是明显的)。

我理解这一点,如果我要做同步请求,但我有:

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

有人可以帮忙吗?

5 个答案:

答案 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");
       }
            });

     });