2017-02-22 5 views
7

У меня есть приложение, которое проверяет базу данных каждые 10 секунд, если есть какие-либо новые данные, если есть какие-либо данные, которые она получит, и прекратить проверку базы данных.Фон липкая совпадающая метка развертки GC освобождена

Я внедрил наблюдателя текста, чтобы проверить, пусто ли текстовое поле. Если это так, он проверит базу данных, если она содержит любой текст, который он остановит.

Это мой код:

@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

Это прекрасно. Это означает, что вы используете память, а затем ее освобождаете GC. Его единственной проблемой является либо вы уйдете из памяти, либо вы увидите, что икота производительности связана с сборкой мусора. Но это не то, что вам нужно для гонки, чтобы исправить.

+0

Спасибо, сэр! В конце концов, я могу дышать спокойно, ха-ха. –

+0

Итак, какое решение исправить эту проблему, я столкнулся с такой же ситуацией для редактирования текстового поля ??? –

+0

@GeorgySavatkov это не проблема, так что нечего решать. Некоторые алгоритмы/приложения просто используют память. Если нет производительности икоты, это совершенно нормально –

0

У меня была та же проблема. Ваш код будет работать, но если это зависает слишком долго, приложение может получить сообщение об ошибке «Не реагировать» и закрыть. Он также поражает цель использования AsyncTask.

Проблема заключается в том, что ваш AsyncTask содержит текстовое представление, поэтому он блокирует любые другие действия во время выполнения. Чтобы исправить это, сделайте свой статический AsyncTask и передайте ему ссылку на представление «Текст». Затем сохраните его в режиме WeakReference.

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(); 
} 
} 
Смежные вопросы