2011-05-17 8 views
5

मेरे पास फोनगैप-एंड्रॉइड ऐप है और मैं jquery का उपयोग कर रहा हूं। मैं ASYNCHRONOUS AJAX कॉल कर रहा हूं और कॉल के दौरान, ऐप बस फ्रीज करता है और AJAX कॉल फिनिश के बाद प्रतीक्षा करता है (यह मुख्य रूप से जीएसएम कनेक्शन पर ध्यान देने योग्य है)।एसिंक्रोनस AJAX कॉल करते समय एंड्रॉइड में फ्रीजिंग फोनगैप ऐप को कैसे रोकें?

मुझे यह समझ होगा, अगर मैं तुल्यकालिक अनुरोध कर रहे होते हैं, लेकिन मेरे पास है:

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

किसी मदद कर सकते हैं?

उत्तर

1

आज भी यही समस्या में भाग लें। एक 10T देरी के साथ एक सेटटाइमआउट का उपयोग कर इसे हल किया।

यह सुनिश्चित नहीं है कि यह क्यों काम करता है, जो डरावना है। लेकिन काम करता है।

1

क्या आप अपना यूएएक्स कॉल मुख्य यूआई थ्रेड से प्राप्त कर सकते हैं? उदाहरण:

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 में समाधान के लिए देख रहा हूँ क्योंकि मेरे एप्लिकेशन एचटीएमएल 5 में लिखा है PhoneGap ... – Frodik

+0

का उपयोग कर क्षमा करें कि सहायक नहीं था। मैं इसे अपने पसंदीदा में जोड़ रहा हूं। मुझे भी जवाब में दिलचस्पी होगी। +1 –

0

Jquery डॉक्स से:

async बूलियन डिफ़ॉल्ट: सच डिफ़ॉल्ट रूप से, सभी अनुरोधों एसिंक्रोनस रूप से (यानी यह डिफ़ॉल्ट रूप से सही पर सेट किया जाता है) भेजा जाता है। यदि आपको सिंक्रोनस अनुरोधों की आवश्यकता है, तो इस विकल्प को गलत पर सेट करें। क्रॉस-डोमेन अनुरोध और डेटा टाइप: "jsonp" अनुरोध सिंक्रोनस ऑपरेशन का समर्थन नहीं करते हैं। ध्यान दें कि अनुरोध सक्रिय होने पर सिंक्रोनस अनुरोध अस्थायी रूप से ब्राउज़र को लॉक कर सकते हैं, किसी भी क्रिया को अक्षम कर सकते हैं।

चूंकि लोकलहोस्ट पर फोनगैप कोड चल रहा है, यह क्रॉस-डोमेन होगा। यदि आप कर सकते हैं, तो पोस्ट के बजाय जीईटी के माध्यम से अनुरोध करें।

+0

समझ में नहीं आता है - यह कहता है कि क्रॉसडोमेन * * * तुल्यकालिक समर्थन नहीं करता है। बनाम पोस्ट प्राप्त करें यहां कोई फर्क नहीं पड़ता है। – Yuvi

1

मुझे एक ही समस्या थी, और मैंने फोनगैप द्वारा निकाले गए "डिवाइस से पहले" ईवेंट पर AJAX अनुरोध को कॉल करके हल किया।

मैंने दुर्घटना here द्वारा एक ट्यूटोरियल पढ़ा जो कहता है कि अनुप्रयोग ठीक से लोड होने के बाद AJAX अनुरोध भेजा जा सकता है। सबसे पहले डिवाइस से पहले ईवेंट को बाध्य करें और ईवेंट हैंडलर के अंदर 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"); 
     } 
      }); 

    }); 
संबंधित मुद्दे