2017-02-22 13 views
7

मैं एक आवेदन है कि डेटाबेस हर 10 सेकंड की जाँच करता है, तो कोई नया डेटा है वहाँ है, अगर वहाँ किसी भी डेटा को इसे पाने और डेटाबेस की जाँच बंद हो जाएगा है।पृष्ठभूमि चिपचिपा समवर्ती निशान स्वीप जीसी मुक्त कर दिया

मैं अगर टेक्स्ट बॉक्स खाली है की जाँच करने के लिए एक पाठ द्रष्टा लागू किया है। यदि ऐसा है, तो यह डेटाबेस की जांच करेगा, अगर इसमें कोई टेक्स्ट शामिल है तो यह रुक जाएगा।

यह मेरा कोड है:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    txtBoxUser.addTextChangedListener(checkUserRent); 

    getData(); 
} 


//TEXTWATCHER FOR GETTING PERSON WHO RENTED BOX 
private final TextWatcher checkUserRent = new TextWatcher() { 
    public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
    } 

    public void onTextChanged(CharSequence s, int start, int before, int count) { 
    } 
    public void afterTextChanged(Editable s) { 
     if (s.length() == 0) { 
      check(); 
     } else { 
      Toast.makeText(MainActivity.this, "STOP", 
        Toast.LENGTH_LONG).show(); 
     } 
    } 
}; 


public void start(View view) 
{ 
    getData(); 
} 

public void cancel(View view) 
{ 
    txtBoxUser.setText(""); 
    txtBoxPasscode.setText(""); 
} 

private void getData(){ 

    final String id = txtBoxName.getText().toString().trim(); 

    class GetEmployee extends AsyncTask<Void,Void,String>{ 
     ProgressDialog loading; 
     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
     //  loading = ProgressDialog.show(MainActivity.this,"Fetching...","Wait...",false,false); 
     } 

     @Override 
     protected void onPostExecute(String s) { 
      super.onPostExecute(s); 
     //  loading.dismiss(); 
      showEmployee(s); 
     } 

     @Override 
     protected String doInBackground(Void... params) { 
      RequestHandler rh = new RequestHandler(); 
      String s = rh.sendGetRequestParam(DATA_URL,id); 
      return s; 
     } 
    } 
    GetEmployee ge = new GetEmployee(); 
    ge.execute(); 
} 

private void showEmployee(String json){ 
    try { 
     JSONObject jsonObject = new JSONObject(json); 
     JSONArray result = jsonObject.getJSONArray(JSON_ARRAY); 
     JSONObject c = result.getJSONObject(0); 
     String name = c.getString(GET_BOXUSER); 
     String desg = c.getString(GET_PASSCODE); 

     txtBoxUser.setText(name); 
     txtBoxPasscode.setText(desg); 

    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 
} 


private void check() 
{ 
    getData(); 

} 

लेकिन जब यह डेटा के लिए प्रतीक्षा कर रहा है मैं logcat में यह मिलता है। मैं बस सोच रहा हूं कि यह ठीक है या सुरक्षित है?

I/art: Background sticky concurrent mark sweep GC freed 5614(449KB) AllocSpace objects, 18(288KB) LOS objects, 33% free, 1691KB/2MB, paused 5.354ms total 10.731ms 
I/art: Background sticky concurrent mark sweep GC freed 7039(557KB) AllocSpace objects, 22(352KB) LOS objects, 39% free, 1561KB/2MB, paused 10.554ms total 15.931ms 
I/art: Background partial concurrent mark sweep GC freed 7279(564KB) AllocSpace objects, 21(336KB) LOS objects, 40% free, 1504KB/2MB, paused 5.721ms total 15.823ms 
I/art: WaitForGcToComplete blocked for 5.375ms for cause HeapTrim 
I/art: Background partial concurrent mark sweep GC freed 7650(591KB) AllocSpace objects, 22(352KB) LOS objects, 40% free, 1505KB/2MB, paused 5.511ms total 21.465ms 

उत्तर

9

यह बिल्कुल ठीक है। इसका मतलब है कि आप स्मृति का उपयोग कर रहे हैं, फिर इसे जीसी द्वारा मुक्त किया जा रहा है। इसकी एकमात्र समस्या यह है कि आप स्मृति से बाहर हैं, या आप कचरा संग्रह के कारण प्रदर्शन हिचकी देखते हैं। लेकिन इसे ठीक करने के लिए दौड़ने की आवश्यकता नहीं है।

+0

धन्यवाद, महोदय! कम से कम मैं अब आसान साँस ले सकते हैं हाहा। –

+0

तो, इस समस्या को ठीक करने का समाधान क्या है, मुझे टेक्स्ट बॉक्स संपादित करने के लिए एक ही स्थिति का सामना करना पड़ रहा है ??? –

+0

@GeorgySavatkov यह एक समस्या नहीं है, इसलिए वहाँ हल करने के लिए कुछ भी नहीं है। कुछ एल्गोरिदम/ऐप्स बस स्मृति का उपयोग करते हैं। यदि कोई प्रदर्शन हिचकी कि पूरी तरह से ठीक है –

0

मैं एक ही मुद्दा था। आपका कोड काम करेगा, लेकिन अगर यह बहुत लंबे समय तक लटकता है, तो ऐप एक ऐप को प्रतिक्रिया और त्रुटि का जवाब नहीं दे सकता है। यह एक AsyncTask का उपयोग करने के उद्देश्य को भी हरा देता है।

मुद्दा यह है कि आपके AsyncTask तो यह किसी अन्य क्रिया निष्पादित करते समय को अवरुद्ध कर देगा एक पाठ दृश्य होता है। इसे ठीक करने के लिए, अपना AsyncTask स्थिर बनाएं और इसे टेक्स्ट व्यू का संदर्भ दें। फिर इसे वीक रेफरेंस में स्टोर करें।

static class GetEmployee extends AsyncTask<Void,Void,String>{ 

    WeakReference<TextView> textUserWeakReference; 
    WeakReference<TextView> textPassWeakReference; 
    GetEmployee(TextView textUser, TextView textPass) { 
     textUserWeakReference = new WeakReference<>(textUser); 
     textPassWeakReference = new WeakReference<>(textPass); 
    } 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
    //  loading = ProgressDialog.show(MainActivity.this,"Fetching...","Wait...",false,false); 
    } 

    @Override 
    protected void onPostExecute(String s) { 
     super.onPostExecute(s); 
    //  loading.dismiss(); 
     TextView textUser = textUserWeakReference.get(); 
     TextView textPass = textPassWeakReference.get(); 
     if(textView != null && textPass != null) 
      showEmployee(s, textUser, textPass); 
    } 

    @Override 
    protected String doInBackground(Void... params) { 
     RequestHandler rh = new RequestHandler(); 
     String s = rh.sendGetRequestParam(DATA_URL,id); 
     return s; 
    } 
} 
private static void showEmployee(String json, TextView txtBoxUser, TextView txtBoxPassCode){ 
try { 
    JSONObject jsonObject = new JSONObject(json); 
    JSONArray result = jsonObject.getJSONArray(JSON_ARRAY); 
    JSONObject c = result.getJSONObject(0); 
    String name = c.getString(GET_BOXUSER); 
    String desg = c.getString(GET_PASSCODE); 

    txtBoxUser.setText(name); 
    txtBoxPasscode.setText(desg); 

} catch (JSONException e) { 
    e.printStackTrace(); 
} 
} 
संबंधित मुद्दे