如何在不降低应用程序速度的情况下启动服务



在我的Android应用程序中,我运行的服务会大大降低我的应用程序的速度。我不知道是否有我选择的最佳方式。我想这是因为我使用sleep()函数每隔x秒检查一次网站上是否有什么变化,但我绝对不确定。这是代码:

    package com.example.goo;
//import
    public class ServiceLive extends Service{
        ThreadDemo td = new ThreadDemo();
        String[] tabAllTeams;
        String[] tabAllScores;
        String code;
        Document doc;
        @Override
        public IBinder onBind(Intent arg0) {
            // TODO Auto-generated method stub
            return null;
        }
        @Override
        public void onCreate() {
            super.onCreate();

            System.out.println("Lancement de mon service");
            td.run();
        }
        public String[] getAllTeams(){
            return tabAllTeams;
        }
        public String[] getAllScores(){
            return tabAllScores;
        }
        private class ThreadDemo extends Thread{
            @Override
            public void run() {
                super.run();
                try{
                    ThreadDemo.sleep(3000*10);
                    System.out.println("check again");
                    new NetworkOperation().execute();
                }catch(Exception e){
                    e.getMessage();
                }
                new NetworkOperation().execute();
            }
        }
        //Get All Data
        class NetworkOperation extends AsyncTask<Void, Void, String > {
            protected String doInBackground(Void... params) {
                try {
                    //Définir Site De Récupération
                    doc = Jsoup.connect("http://www.siteduzero.com").get();
                    //Définir Classe de Récupération
                    Elements getId = doc.getElementsByClass("page-visitors");   
                    code = getId.text();
                } catch (Exception e) {
                    e.printStackTrace();
                }
                td.run();
                return null;
            }
        }
    }

减缓应用程序速度的部分是什么?谢谢

解决方案:

在这里查看Maurice Gavin的答案:如何在android 的新线程中启动服务

您正在服务的主线程上运行Thread。服务的主线程与活动中的UI线程是同一个线程。。

因此,Sleep调用正在UI线程上运行。。。。。

请用.start()而不是.run() 启动Thread

使用.run(),您将在线程内部启动可运行程序,而不是线程本身。。。

   @Override
    public void onCreate() {
        super.onCreate();
        System.out.println("Lancement de mon service");
        td.start();
    }
private class ThreadDemo extends Thread{
    @Override
    public void run() {
        super.run();
        try{
            ThreadDemo.sleep(3000*10);
            System.out.println("check again");
            doInternetStuff();
        }catch(Exception e){
            e.getMessage();
        }
        doInternetStuff();
    }
}
private void doInternetStuff() {
    try {
        //Définir Site De Récupération
        doc = Jsoup.connect("http://www.siteduzero.com").get();
        //Définir Classe de Récupération
        Elements getId = doc.getElementsByClass("page-visitors");   
        code = getId.text();
    } catch (Exception e) {
        e.printStackTrace();
    }
    new ThreadDemo().start();
}

您的问题就在这里:

public void onCreate() {
        super.onCreate();
        System.out.println("Lancement de mon service");
        td.run();
}

服务不在自己的线程上运行,而是在应用程序主线程上运行。此外,run不启动新线程,而是在进行调用的线程内运行Runnable对象的代码。最后,您将在UI线程中完成所有工作。首先,你应该调用td.start(),我也会把这个代码放在onStartCommand()而不是onCreate()中。CCD_ 11在每次创建服务时被调用一次,但不是每次接收Intent时都被调用。CCD_ 12针对由CCD_ 14接收到的每个CCD_。

相关内容

最新更新