2011-05-17 53 views
5

我有PhoneGap-Android應用程序,我正在使用Jquery。我正在做異步AJAX調用,並且在通話期間,應用程序只是在AJAX呼叫完成後凍結並等待(在GSM連接時它主要引人注目)。如何防止在進行異步AJAX調用時凍結Android中的PhoneGap應用程序?

我能明白這一點,如果我也可以做同步的請求,但我有:

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

任何人都可以幫忙嗎?

回答

1

今天遇到同樣的問題。通過使用延遲10ms的setTimeout來解決這個問題。

不知道它爲什麼有效,這是可怕的。但確實有效。

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; 
      } 
     } 

    } 

} 
+0

感謝的答案,但我實際上是尋找在jQuery的解決方案,因爲我的應用程序使用PhoneGap的... – Frodik 2011-05-17 15:48:15

+0

比較遺憾的是沒有幫助用HTML5編寫的。我將它添加到我的最愛。我也會對答案感興趣。 +1 – 2011-05-17 16:00:08

0

從jQuery文檔:

異步 布爾 默認值:true 缺省情況下,所有的請求是非同步地發送(即,這是通過默認設置爲true)。如果您需要同步請求,請將此選項設置爲false。跨域請求和dataType:「jsonp」請求不支持同步操作。請注意,同步請求可能會暫時鎖定瀏覽器,並在請求處於活動狀態時禁用任何操作。

由於phonegap代碼在本地主機上運行,​​它將跨域。如果可以,請通過GET而不是POST進行請求。

+0

沒有意義 - 它表示跨域不支持同步。 GET和POST在這裏沒有什麼區別。 – Yuvi 2012-02-23 12:21:45

1

我有同樣的問題,我通過調用phonegap觸發的「deviceready」事件上的ajax請求來解決此問題。

我偶然讀了一篇教程here,其中指出可以在正確加載應用程序之後發送ajax請求。首先綁定到文檔deviceready事件並在事件處理程序中發送ajax請求。這樣做可以解決阻塞用戶界面問題。

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

我希望這也能解決您的問題。

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

    }); 
相關問題