应用程序冻结并在打开时需要很长时间才能响应

时间:2017-02-10 06:01:57

标签: android android-service runnable android-handler

我有一个应用程序服务在后台运行,我也在使用Handler。

@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值更新listview我正在使用handler。因此,当我打开应用程序时,打开速度非常慢,需要很长时间。有时应用程序没有响应。滚动列表视图也不顺畅哪些卡住了。请帮助我实现我所做的是正确的?请帮忙。

解决方案:

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

使用上面的代码我能够成功更新列表。但是打开时app仍然很慢。任何建议。

1 个答案:

答案 0 :(得分:1)

好的,您不断创建新的适配器并进行设置。这会破坏你的表现。您需要这样做,以便您的适配器可以更改数据,而不是重新创建。这也意味着你不会需要setSelectionFromTop代码,这也会导致重复循环的性能下降。解决这两件事,你可能会很好。