서비스가 백그라운드에서 실행중인 앱을 가지고 있는데 핸들러를 사용하고 있습니다.앱이 멈추고 응답하는 데 오랜 시간이 걸립니다.
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_seconds);
if(!isMyServiceRunning(serv.class))
{
startService(new Intent(this, serv.class));
} else {
Log.e("Shiva","Service already running");
}
status = (EditText)findViewById(R.id.status);
btn_send = (ImageButton) findViewById(R.id.btn_send);
btn_send.setOnClickListener(this);
contlist = (ListView)findViewById(R.id.contlist);
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
String y = prefs.getString("mobstat",null);
status.setText(y);
status.setSelection(status.getText().length());
if(!prefs.getBoolean("firstTime", false))
{
try
{
getNumber(seconds.this.getContentResolver());
} catch (JSONException e)
{
e.printStackTrace();
}
SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean("firstTime", true);
editor.apply();
}
nonstoprun();
}
private boolean isMyServiceRunning(Class<?> serviceClass)
{
ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE))
{
if (serviceClass.getName().equals(service.service.getClassName()))
{
return true;
}
}
return false;
}
@Override
protected void onPause() {
super.onPause();
handler.removeCallbacks(update);
Log.e("Shiva","Handler Stopped");
}
@Override
protected void onResume() {
super.onResume();
nonstoprun();
Log.e("Shiva","Handler Started");
}
@Override
protected void onDestroy() {
super.onDestroy();
handler.removeCallbacks(update);
}
private void nonstoprun()
{
handler = new Handler();
update = new Runnable()
{
@Override
public void run()
{
if(!isRunning) {
isRunning = true;
musers = (ArrayList<mobstat>) mobstat.listAll(mobstat.class);
descAdapter = new DescAdapter(seconds.this, musers, seconds.this);
int index = contlist.getFirstVisiblePosition();
View v = contlist.getChildAt(0);
int top = (v == null) ? 0 : (v.getTop() - contlist.getPaddingTop());
contlist.setAdapter(descAdapter);
contlist.setSelectionFromTop(index, top);
handler.postDelayed(this, 1000);
} else {
isRunning = false;
}
}
};
handler.postDelayed(update, 10);
}
내 응용 프로그램은 서버에서 데이터를 가져 와서 sqllite db에서 업데이트하는 특정 방법을 실행합니다. 그래서이 목적을 위해 새 db 값으로 listview를 업데이트하려면 handler를 사용하고 있습니다. 그래서 내가 앱을 열 때 매우 열리고 느린 시간이 걸립니다. 앱이 응답하지 않는 경우가 있습니다. 스크롤되는 listview도 원활하게 움직이지 않습니다. 내가 한 일을 올바르게 도와 주시겠습니까? 도와주세요.
솔루션 :
가 한 OnCreate에서 내가 추가 아래 라인 : 위의 코드를 사용하여
musers = (ArrayList<mobstat>) mobstat.listAll(mobstat.class);
descAdapter = new DescAdapter(this,musers,this);
contlist.setAdapter(descAdapter);
그런
private void nonstoprun()
{
update = new Runnable()
{
@Override
public void run()
{
ArrayList<mobstat> musers1 = (ArrayList<mobstat>) mobstat.listAll(mobstat.class);
setData(musers1);
handler.postDelayed(this, 1000);
}
private void setData(ArrayList<mobstat> musers1)
{
musers.clear();
musers.addAll(musers1);
descAdapter.notifyDataSetChanged();
}
};
handler.postDelayed(update, 10);
}
내가 성공적으로 목록을 업데이트 할 수 있어요. 하지만 여전히 열리는 동안 앱이 느립니다. 어떤 제안.
처음에는 서비스가 실행 중인지 확인할 필요가 없습니다. 그냥 시작하십시오. 이미 시작된 경우 새 항목이 시작되지 않습니다. –
@ GabeSechan- 당신이 말한대로 구현해 주셔서 감사합니다. – user2269164
@GabeSechan 고맙습니다. 스톱 서비스에 대한 의견이 있으십니까? –