【问题标题】:How to start a service without slow down the application?如何在不减慢应用程序的情况下启动服务?
【发布时间】:2013-07-17 08:21:13
【问题描述】:

在我的 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 的答案:How to start service in new thread in android

【问题讨论】:

标签: java android performance service


【解决方案1】:

您正在服务的主线程上运行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();
}

【讨论】:

  • 这不起作用,因为您必须从 ui 线程调用 AsyncTask.execute()。如果他将启动线程并尝试在其中调用 AsyncTask.execute,那么他将得到一个异常。
  • 没错,不应该使用ASyncTask,那东西也可以在线程内执行..
  • 已编辑,现在应该可以使用了。您不必使用单独的 AsyncTask
  • 谢谢我去试试
  • 我试过你的代码,但它仍然很慢,但我找到了解决问题的方法。 Maurice Gavin (stackoverflow.com/questions/5138265/…) 的解决方案非常有效。谢谢你的回答
【解决方案2】:

你的问题就在这里:

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

服务不会在自己的线程上运行,而是在您的应用程序主线程上运行。此外,run 不会启动新线程,而是在进行调用的线程内运行 Runnable 对象的代码。总而言之,您正在 UI 线程中完成所有工作。首先你应该打电话给td.start(),我也会把这段代码放在onStartCommand()而不是onCreate()onCreate() 会在每次创建服务时调用一次,但不会在每次接收到 Intent 时调用。 onStartCommand() 会为Service 收到的每个Intent 运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 2017-01-25
    • 2012-06-10
    • 1970-01-01
    • 2022-01-12
    • 2019-04-29
    • 2019-07-27
    相关资源
    最近更新 更多