2017-02-10 3 views
0

서비스가 백그라운드에서 실행중인 앱을 가지고 있는데 핸들러를 사용하고 있습니다.앱이 멈추고 응답하는 데 오랜 시간이 걸립니다.

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

내가 성공적으로 목록을 업데이트 할 수 있어요. 하지만 여전히 열리는 동안 앱이 느립니다. 어떤 제안.

+2

처음에는 서비스가 실행 중인지 확인할 필요가 없습니다. 그냥 시작하십시오. 이미 시작된 경우 새 항목이 시작되지 않습니다. –

+0

@ GabeSechan- 당신이 말한대로 구현해 주셔서 감사합니다. – user2269164

+0

@GabeSechan 고맙습니다. 스톱 서비스에 대한 의견이 있으십니까? –

답변

1

좋아, 당신은 끊임없이 새로운 어댑터를 만들고 설정하고 있습니다. 그것은 당신의 성적을 파괴 할 것입니다. 어댑터가 다시 만들어지기보다는 데이터를 변경할 수 있도록해야합니다. 즉, setSelectionFromTop 코드가 필요 없기 때문에 성능이 반복적으로 반복되는 것을 막을 수 있습니다. 이 두 가지를 고치면 아마 좋을 것입니다.

+0

귀하가 언급 한 어댑터에 대한 예를 제공해 주시겠습니까? 나는 이렇게 listview를 새로운 값으로 업데이트하고있다. 미리 감사드립니다. – user2269164

+1

한 가지 쉬운 방법은 setData (List ) 함수를 제공하는 것입니다.이 함수는 이전 목록을 새 목록으로 바꾸고 notifyDataSetChanged();를 호출합니다. 그것은 데이터를 대체하기에 충분할 것입니다. 너는 더 좋아 할 수 있지만, 먼저 그렇게해라. –

+0

공공 무효 SetData (목록 새 목록) { musers.addAll (새 목록); this.notifyDataSetChanged(); } 그런 다음 핸들러 내부에서 setData를 호출합니다. run -> musers = (ArrayList ) mobstat.listAll (mobstat.class); setData (musers); 하지만 nullpointer 예외가 나타납니다. – user2269164