我有一个应用程序,如果有任何新数据,每隔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
答案 0 :(得分:22)
这很好。这意味着您正在使用内存,然后由GC释放它。它唯一的问题是要么你的内存不足,要么你看到由于垃圾收集导致的性能打嗝。但它不是你需要竞争修复的任何东西。
答案 1 :(得分:1)
我遇到了同样的问题。您的代码将起作用,但如果此代码挂起太长时间,应用程序可能会收到App Not Responding错误并关闭。它也违背了使用AsyncTask的目的。
问题是您的AsyncTask包含一个文本视图,因此它会在执行时阻止任何其他操作。要解决此问题,请使AsyncTask保持静态,并将其传递给Text视图。然后将其存储在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();
}
}
答案 2 :(得分:0)
我遇到了同样的问题,它被一个无限循环调用。这导致我的应用崩溃。
我找到了无限循环,将其删除,现在应用不会崩溃,而且我也没有这些日志了。