Background sticky concurrent mark sweep GC freed

匿名 (未验证) 提交于 2019-12-03 01:33:01

问题:

I have an application that checks the database every 10 seconds if there is any new data, if there is any data it will get it and stop checking the database.

I have implemented a text watcher to check if the textbox is empty. If it is, it will check the database, if it contains any text it will stop.

This is my code:

 @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();  } 

But I get this in the logcat while it is waiting for the data. I am just wondering is it okay or safe?

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 

回答1:

This is perfectly fine. It means that you're using memory, then its being freed by the GC. Its only a problem is either you go out of memory, or you see performance hiccups due to garbage collection. But its not anything you need to race to fix.



回答2:

I have had the same issue. Your code will work, but if this hangs for too long, the app can get a App Not Responding error and close. It also defeats the purpose of using an AsyncTask.

The issue is that your AsyncTask contains a text view so it will block any other actions while executing. To fix this, make your AsyncTask static and pass it a reference to the Text view. Then store it in a 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(); } } 


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!