2017-02-10 1 views
0

У меня есть приложение, в котором служба работает в фоновом режиме, и я использую Handler.app зависает и занимает много времени, чтобы ответить во время открытия

@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 дб. Поэтому для обновления listview с новыми значениями db для этой цели я использую обработчик. Поэтому, когда я открывал приложение, он очень медленно открывается и занимает много времени. Иногда приложение не отвечало. Прокрутка 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 (Список ) Эта функция заменит старый список на новый, а затем вызовет notifyDataSetChanged() ;. Этого достаточно, чтобы заменить данные. Вы можете полюбить, но сначала попробуйте. –

+0

public void SetData (Список newlist) { musers.addВсе (новый список); this.notifyDataSetChanged(); }, а затем вызов setData внутри обработчика -> musers = (ArrayList ) mobstat.listAll (mobstat.class); SetData (musers); но я получаю исключение nullpointer – user2269164

Смежные вопросы