2012-12-19 11 views
5

चला रहे एप्लिकेशन को धीमा कर देता है मैं एक एंड्रॉइड एप्लिकेशन विकसित कर रहा हूं जिसमें मैं JSON का उपयोग कर वेब सेवा से जानकारी प्राप्त करने के लिए एक AsyncTask का उपयोग करता हूं, जिसे तब सूची दृश्य में लोड किया जाता है। यहां तक ​​कि सबकुछ ठीक काम करता है।प्रोग्रेसडियलॉग या प्रोग्रेसबार एंड्रॉइड 4.1

मैंने एक प्रोग्रेसडिअलॉग का उपयोग किया जिसे PreExecute() विधि में शुरू किया गया है और onPostExecute() विधि में खारिज कर दिया गया है। 2.3.3 एंड्रॉइड संस्करण चलाने वाले एमुलेटर में, यह सभी कार्य 7/8 सेकेंड तक लेता है। मैंने 2.3.6 चल रहे वास्तविक डिवाइस के साथ परीक्षण किया है और ऐप का एक ही व्यवहार है।

हालांकि, जब मैं 4.1 एंड्रॉइड संस्करण चलाने वाले एमुलेटर का उपयोग करता हूं, तो यह क्रिया 65 से 70 सेकेंड लगती है। जब मैं प्रोग्रेसडिअलॉग को हटाता हूं, तो कार्रवाई एंड्रॉइड 2.3 और 4.1 संस्करणों में 7/8 सेकेंड लगती है। मैंने इन सभी परिदृश्यों का कई बार परीक्षण किया है।

ऐसा क्यों होता है? मेरे पास इसका परीक्षण करने के लिए 4.1 एंड्रॉइड संस्करण के साथ कोई असली डिवाइस नहीं है, इसलिए मुझे आश्चर्य है कि यह एक एमुलेटर मुद्दा है या नहीं? मैंने प्रोग्रेसडिअलॉग की बजाय सामान्य प्रगति पट्टी सर्कल का उपयोग करने का प्रयास किया है, लेकिन वही बात होती है, यह एंड्रॉइड 4.1 संस्करण में बहुत अधिक समय लेता है।

कोई विचार जो इस अजीब व्यवहार का कारण हो सकता है? : एस

धन्यवाद।

डॉन और जेम्स मैकक्रैकन मेरी गतिविधि से कोड है, क्या आप कृपया इस पर मेरी सहायता कर सकते हैं?

public class MainActivity extends Activity { 
private TextView tvTitleList; 
private ListView lvDataSearch; 
private ProgressDialog dialog; 
private long timeStart; 
private String[] dataSearch; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    tvTitleList = (TextView) findViewById(R.id.tvTitleList); 
    lvDataSearch = (ListView) findViewById(R.id.lvDataSearch); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.activity_main, menu); 
    return true; 
} 

public class ProcessUpdateList extends AsyncTask<Integer, String, String[]> { 
    @Override 
    protected void onPreExecute() { 
     timeStart = System.currentTimeMillis(); 
     System.out.println("pre execute"); 
     try { 
      tvTitleList.setText("working...."); 
      dialog = ProgressDialog.show(MainActivity.this, "", "Loading. Please wait...", true); 
     } catch (Exception e) { 
      System.out.println("Error Async 1: " + e.getMessage()); 
     } 
    } 

    @Override 
    protected String[] doInBackground(Integer... paramss) { 
     try { 
      System.out.println("Get Data"); 
      dataSearch = getDataSearch(); 
     } catch (Exception e) { 
      System.out.println("Error Async 2: " + e.getMessage()); 
     } 
     System.out.println("Return Data " 
       + ((System.currentTimeMillis() - timeStart)/1000)); 
     return dataSearch; 
    } 

    @Override 
    protected void onPostExecute(String[] values) { 
     try { 
      System.out.println("Post Execute Data"); 
      tvTitleList.setText("done in " + ((System.currentTimeMillis() - timeStart)/1000)); 
      updateViewList(); 
      dialog.dismiss(); 
     } catch (Exception e) { 
      System.out.println("Error Async 3: " + e.getMessage()); 
     } 
    } 
} 

public void eventUpdateList() {  
    ProcessUpdateList process = new ProcessUpdateList(); 
    try { 
     process.execute(); 
    } catch (Exception e) { 
     System.out.println("NEW ERROR 2: " + e.getMessage()); 
    } 
} 

public String[] getDataSearch() { 
    try { 
     String readTwitterFeed = readJSON2("http://search.twitter.com/search.json?q=hey"); 

     JSONObject jsonObject = new JSONObject(readTwitterFeed); 
     JSONArray jsonArray = new JSONArray(); 

     jsonArray.put(jsonObject); 
     Gson gson = new GsonBuilder().setPrettyPrinting().create(); 
     String json = gson.toJson(jsonObject); 

     JSONObject jsonObject2 = new JSONObject(json); 
     JSONObject level1 = jsonObject2.getJSONObject("nameValuePairs"); 
     JSONObject level2 = level1.getJSONObject("results"); 
     JSONArray level3 = level2.getJSONArray("values"); 

     dataSearch = new String[level3.length()];     
     System.out.println(level3.length()+" resultados encontrados.");; 

     for(int i=0; i<level3.length(); i++) { 
      dataSearch[i] = level3.getJSONObject(i).getJSONObject("nameValuePairs").getString("text"); 
     }   
    } 
    catch(JSONException e) { 
     System.out.println(e.getMessage()); 
    }  
    return dataSearch;  
} 

public String readJSON2(String command) { 
    JSONObject jObj = null; 
    StringBuilder builder = new StringBuilder(); 
    HttpClient client = new DefaultHttpClient(); 
    HttpGet httpGet = new HttpGet(command); 
    try { 
     HttpResponse response = client.execute(httpGet); 
     StatusLine statusLine = response.getStatusLine(); 
     int statusCode = statusLine.getStatusCode(); 
     if (statusCode == 200) { 
      HttpEntity entity = response.getEntity(); 
      InputStream content = entity.getContent(); 
      BufferedReader reader = new BufferedReader(
        new InputStreamReader(content)); 
      String line; 
      while ((line = reader.readLine()) != null) { 
       builder.append(line); 
      } 
      reader.close(); 
      jObj = new JSONObject(builder.toString()); 
     } else { 
      System.out.println(MainActivity.class.toString() + " Failed to download file"); 
     } 
    } catch (Exception e) { 
     return null; 
    } 
    return builder.toString(); 
} 

public void updateViewList() { 
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, android.R.id.text1, dataSearch);     
    lvDataSearch.setAdapter(adapter); 
} 

public void clickBRefreshList(View v) { 
    eventUpdateList(); 
} 
} 
+0

मैं ऐसा नहीं होने का कारण सोच सकता हूं। क्या आप लॉग पोस्ट कर सकते हैं? –

+1

यहां कुछ ख़राब है, किसी भी दृश्य को दिखाते हुए किसी भी समय नहीं लेना चाहिए। यदि आप 0.875 सेकेंड या "7 या 8" सेकेंड का मतलब रखते हैं तो यह भी अस्पष्ट है। यदि आपका मतलब 7-8 है, तो कुछ निश्चित रूप से गलत है। आपको अपने AsyncTask के लिए कोड पोस्ट करना चाहिए। – dmon

उत्तर

4

मैं केवल उसी एमेलेटर में 4.1 पर परीक्षण करने की पुष्टि कर सकता हूं। मेरे वास्तविक डिवाइस (गैलेक्सी एस 3 - 4.1) पर ऐसा नहीं होता है। इसके अलावा, यह केवल अनिश्चित प्रगति सलाखों के साथ होता है। मुझे नहीं पता कि ऐसा क्यों होता है, लेकिन शायद आप यह जानकर बेहतर महसूस करेंगे कि यह दूसरों के साथ होता है। मैं आपके जैसे लगभग एक ही क्रियाएं कर रहा हूं, एक webservice से कनेक्ट कर रहा हूं, एक एक्सएमएल प्रतिक्रिया पार्स कर रहा हूं, फिर पार्सड प्रतिक्रिया प्रदर्शित कर रहा हूं। एफवाईआई, मैं के android:empty फ़ंक्शन के लिए ProgressBar का उपयोग कर रहा हूं।

संपादित करें: Ran कुछ परीक्षण

मैं xml फ़ाइल को पार्स करने का परीक्षण किया और लेआउट में ProgressBar साथ मैं यह मिल गया:

Parse time: 94785 ms

तो, मैं इस

<ProgressBar 
     android:id="@id/android:empty" 
     style="@android:style/Widget.Holo.ProgressBar" 
     android:layout_width="wrap_content" 
     android:layout_height="0dip" 
     android:layout_gravity="center_horizontal|center_vertical" 
     android:layout_weight="1"/> 
बदल

इस

<TextView 
     android:id="@id/android:empty" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Searching..."/> 

और मिल गया इस Parse time: 2642 ms

नोट: मेरी ProgressBar और ListView एक LinearLayout में हैं और सभी पार्स एक AsyncTask में किया जाता है। यह सब एमुलेटर पर है। वास्तव में अजीब ... मेरा अनुमान है कि एमुलेटर वास्तव में UI से धागे को अलग नहीं करता है, इसलिए AsyncTask और ProgressBar कताई सीपीयू चक्रों के लिए लड़ रहे हैं, जबकि एक वास्तविक फोन में यह इरादा के रूप में कार्य करता है क्योंकि यह नकल नहीं होता है।

संपादित करें: तो, मेरे WinXP पर कार्य प्रबंधक देखने के बाद, एमुलेटर 7 धागे चलने से शुरू होता है।मैंने अपना ऐप लॉन्च किया, कई AsyncTask के माध्यम से AsyncTask.THREAD_POOL_EXECUTOR का उपयोग करके चलाया और थ्रेड गिनती इस पूरी प्रक्रिया के दौरान 7 (टास्क मैनेजर में) से कभी नहीं बदली।

+0

जब मैंने यह धागा देखा तो मैं बस इसी तरह की समस्या के बारे में पोस्ट करने वाला था। मैं अपने 4.4.2 एम्यूलेटर में एक ही चीज़ देख रहा हूं। एक AsyncTask जिसमें मैं http पोस्ट से प्रतिक्रिया प्राप्त कर रहा हूं और प्राप्त कर रहा हूं, केवल 1-2 सेकंड से 80-90 सेकेंड तक बढ़ गया है जब मैं दृश्य में प्रोग्रेसबार जोड़ता हूं। यह विंडोज़ पर चल रहे ब्लूस्टैक्स के साथ दिखाई नहीं दे रहा था, इसलिए मैं अनुशंसा करता हूं कि अन्य ब्लूस्टैक्स का परीक्षण करें, भले ही उनके पास परीक्षण करने के लिए एंड्रॉइड डिवाइस न हो। – ScottyB

संबंधित मुद्दे