web-dev-qa-db-ja.com

バックグラウンドスティッキーコンカレントマークスイープGCが解放されました

新しいデータがある場合は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
16
user6150841

これはまったく問題ありません。これは、メモリを使用していて、GCによって解放されていることを意味します。唯一の問題は、メモリ不足になるか、ガベージコレクションによるパフォーマンスの低下が発生することです。しかし、それはあなたが修正するために競争する必要があるものではありません。

23
Gabe Sechan

私も同じ問題を抱えています。コードは機能しますが、これが長すぎる場合、アプリはアプリが応答していませんというエラーを取得して閉じることができます。また、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();
}
}
1
Joel Page