当服务在后台运行时,应用程序将很慢

时间:2018-01-24 07:59:38

标签: android performance service

我在我的应用程序中使用服务,以便从服务器获取数据并将接收的数据保存在我的本地数据库中。

但是当我使用应用程序并且我的服务将在后台运行时,应用程序的运行速度太慢。

这是我使用的服务类:

public class InternetService extends Service implements Loader.OnLoadCompleteListener<Cursor> {

  public static final int notify = 5 * 60 * 60 * 1000;  //interval between two services(Here Service run every 1 Minute)
  private Handler mHandler = new Handler();   //run on another Thread to avoid crash
  private Timer mTimer = null;    //timer handling
  private ArrayList<FileModel> failedIDDownloads = new ArrayList<>();

  private static final String TAG = "BroadcastService";
  public static final String BROADCAST_ACTION = "my_package";
  Intent intent;
  int counter = 0;

  private CursorLoader cursorLoader;

  private EncycDatabase encycDB;

  @Override
  public IBinder onBind(Intent intent) {
    throw new UnsupportedOperationException("Not yet implemented");
  }

  @Override
  public void onCreate() {

    intent = new Intent(BROADCAST_ACTION);
  }

  @Override
  public void onStart(Intent intent, int startId) {

    cursorLoader = new CursorLoader(this, Uri.parse(EncycDatabase.CONTENT_PROVIDER_URL),
      null, null, null, null);
    cursorLoader.registerListener(1, this);
    cursorLoader.startLoading();

    mHandler.removeCallbacks(sendUpdatesToUI);
    mHandler.postDelayed(sendUpdatesToUI, 1000); // 1 second

  }


  @Override
  public void onDestroy() {
    super.onDestroy();

    // Stop the cursor loader
    if (cursorLoader != null) {
      cursorLoader.unregisterListener(this);
      cursorLoader.cancelLoad();
      cursorLoader.stopLoading();
    }

  }

  @Override
  public void onLoadComplete(Loader<Cursor> loader, Cursor cursor) {

    encycDB = new EncycDatabase();

    try {

      while (cursor.moveToNext()) {
        G.TOKEN = (cursor.getString(cursor.getColumnIndex("user_session_token")));
      }

      populateEncyclopediaData();

      Thread searchTagThread = new Thread(new Runnable() {
        @Override
        public void run() {

          populateSearchTagsEncyc();
          populateSearchTags();
        }
      });

      G.handler.postDelayed(new Runnable() {
        @Override
        public void run() {

          checkForDownloadFiles();
        }
      },10 *60* 1000);

      searchTagThread.start();

    } catch (Exception e) { //When happened an error in getting Token!
      e.printStackTrace();
    }
  }

  private void populateEncyclopediaData() {

    final APIService service = ServiceGenerator.createService(APIService.class,
      new PreferenceManager(G.context).getLastUpdateForEncyclopediaData(), G.TOKEN);

    service.getLastChanges()
      .subscribeOn(Schedulers.newThread())
      .observeOn(Schedulers.io())
      .subscribe(new Observer<Response<ArrayList<ServerLastChangesModel>>>() {
        @Override
        public void onSubscribe(Disposable d) {
        }

        @Override
        public void onNext(Response<ArrayList<ServerLastChangesModel>> response) {
          Log.i("LOGO_Encycloedia", "Request code: " + response.code());

          if (response.code() == 200) {

            G.encyclopediaArray.clear();

            for (int i = 0; i < response.body().size(); i++) {

              EncyclopediaModel lcModel = new EncyclopediaModel();
              lcModel.setEncyclopedia_id(response.body().get(i).getEncyclopediaId());
              lcModel.setEncyclopedia_title(response.body().get(i).getEncyclopediaTitle());
              lcModel.setEncyclopedia_modified_date(response.body().get(i).getEncyclopediaModifiedDate());
              lcModel.setEncyclopedia_deleted(response.body().get(i).getEncyclopediaDeleted());
              lcModel.setEncyclopedia_content_id(response.body().get(i).getEncyclopediaContentId());
              lcModel.setEncyclopedia_out_desc_text_id(response.body().get(i).getEncyclopediaOutDescTextId());
              lcModel.setEncyclopedia_in_desc_text_id(response.body().get(i).getEncyclopediaInDescTextId());
              lcModel.setEncyclopedia_order_in_parent(response.body().get(i).getEncyclopediaOrderInParent());
              lcModel.setEncyclopedia_parent_id(response.body().get(i).getEncyclopediaParentId());
              lcModel.setEncyclopedia_is_inline_parent(response.body().get(i).getEncyclopediaIsInlineParent());
              lcModel.setEncyclopedia_style_sheet(response.body().get(i).getEncyclopediaStyleSheet());

              G.encyclopediaArray.add(lcModel);
            }

          }

        }

        @Override
        public void onError(Throwable e) {
        }

        @Override
        public void onComplete() {
          try {
            encycDB.insertIntoEncyclopediaDB(G.encyclopediaArray);
            new PreferenceManager(G.context).writeLastUpdateForEncyclopediaData();
          } catch (Exception e) {
            e.printStackTrace();
          }

          populateContentData(encycDB.getContentIdsFromEncyclopedia());

        }
      });
  }

正如您所看到的,我使用了线程,但它没有帮助! 我无法找出问题所在。

1 个答案:

答案 0 :(得分:0)

服务在后台运行,但它在应用程序的主线程上运行。 IntentService在单独的工作线程上运行。 将代码移动到IntentService。