具有处理程序和线程的 Android 服务

标签 android multithreading android-service

我有一个启动新服务的应用程序。在此服务中,我目前有一个处理程序每​​分钟执行一些工作,然后通过 BroadcastReceiver 将结果发送到主要 Activity 。我想要以下东西:每分钟在服务中创建一个新线程,让它完成工作并向处理程序发送一条消息,它已完成,然后处理程序将通过 BroadcastReceiver 发送到主 Activity 。我怎样才能结合线程和处理程序?这是我目前所拥有的 - 只有部分感兴趣的代码 -

private Runnable sendUpdatesToUI = new Runnable() {



    public void run() {
        try {
            getAppResources(); //this is the work i want to place in a new thread
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        intent.putExtra(key,value);
        sendBroadcast(intent);
        handler.postDelayed(this, 60*1000); 
    }
};

这是我知道我需要做的

 private Runnable sendUpdatesToUI = new Runnable() {

    public void run() {
       /* try {
            getAppResources();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }*/

         Thread t = new Thread() {
            @Override
            public void run(){
                 try {
                    getAppResources();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
               handler.sendEmptyMessage(0);
            }
        };


        handler.postDelayed(this, 60*1000); 
    }
};

我应该把 handleMessage 放在哪里?如果我将它放在 Runnable 中,它会说它从未在本地使用过。我只是将它放在 Runnable 之前?

 public void handleMessage(Message msg){
    if(msg.what == 0){
        intent.putExtra(key,value);
        sendBroadcast(intent);
    }
 }

我应该这样做吗?

编辑:向主要 Activity 发送一些数据的处理程序代码

 private final Handler handler = new Handler(){
     public void handleMessage(Message msg){
        if(msg.what == 0){
             Log.d("HANDLE","Am primit mesaj");
            //Notify preparations
            intent.putExtra("RunningApps", runningApps.size());
            intent.putExtra("CPU", highestDrainPackageCPU);

            intent.putExtra("GPS",highestDrainPackageGPS);
            intent.putExtra("WIFI", highestDrainPackageWIFI);

            //Now i have all my data, time to send them to the activity
            //First , send the strings to be set in the TextViews
            //Each running app has 7 messages to display -> ArrayList<String>
            for(int i=0;i<runningApps.size();i++){
                intent.putStringArrayListExtra(String.valueOf(i), appInfo.get(i));
            }

            //Next send values to plot the chart
            //CPU energy consumption for highest draining application
            double [] currValues_cpu = new double[tableCPU.get(highestDrainPackageCPU).size()];
            Log.d("CPUSIZE",String.valueOf(currValues_cpu.length));
            for(int j=0;j<tableCPU.get(highestDrainPackageCPU).size();j++){
                currValues_cpu[j]=tableCPU.get(highestDrainPackageCPU).get(j);
                Log.d("CPUVALUE",String.valueOf(currValues_cpu[j])+"For application"+highestDrainPackageCPU);
            }

            intent.putExtra("highestDrainPackageCPU", currValues_cpu);


            //GPS energy consumption for highest draining application
            double [] currValues_gps = new double[tableGPS.get(highestDrainPackageGPS).size()];
            for(int j=0;j<tableGPS.get(highestDrainPackageGPS).size();j++){
                currValues_gps[j]=tableGPS.get(highestDrainPackageGPS).get(j);
            }
            intent.putExtra("highestDrainPackageGPS", currValues_gps);

            //WIFI energy consumption for highest draining application
            double [] currValues_wifi = new double[tableWIFI.get(highestDrainPackageWIFI).size()];
            for(int j=0;j<tableWIFI.get(highestDrainPackageWIFI).size();j++){
                currValues_wifi[j]=tableWIFI.get(highestDrainPackageWIFI).get(j);
            }
            intent.putExtra("highestDrainPackageWIFI", currValues_wifi);

            sendBroadcast(intent);

        }
    }
};

这里是Main Activity中的BroadcastReceiver和UpdateUI函数:

 private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        updateUI(intent);       
    }
};

public void updateUI(Intent intent){

    resourceTab.removeAllViews();
    //statisticsTab.removeAllViews();

    int apps_no = intent.getIntExtra("RunningApps", 0);

    String highestDrainPackageCPU = intent.getStringExtra("CPU");

    String highestDrainPackageGPS = intent.getStringExtra("GPS");

    String highestDrainPackageWIFI = intent.getStringExtra("WIFI");


    //TO-DO: Get information for each app and store it in textview.Then add it to a linearlayout
    for(int i=0;i<apps_no;i++){

        //Setup delimiter
        View delimitator = new View(this);
        delimitator.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,1));
        delimitator.setBackgroundColor(Color.parseColor("#50FFFFFF"));

        //Extract values
        ArrayList<String> info = new ArrayList<String>();
        info=intent.getStringArrayListExtra(String.valueOf(i));

        for(int j=0;j<info.size();j++){
            TextView infoApp = new TextView(this);
            //////Setup textview//////////
            infoApp = new TextView(this);
            infoApp.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT));
            infoApp.setTextColor(Color.parseColor("#FFFFFF"));
            infoApp.setText(info.get(j));

            resourceTab.addView(infoApp);
        }

        //Add delimiter
        resourceTab.addView(delimitator);
    }

    double [] cpu_values = intent.getDoubleArrayExtra("highestDrainPackageCPU");

    double [] gps_values = intent.getDoubleArrayExtra("highestDrainPackageGPS");

    double [] wifi_values = intent.getDoubleArrayExtra("highestDrainPackageWIFI");

    //Now plot the graph
    createGraphOverall(cpu_values, gps_values, wifi_values, highestDrainPackageCPU, highestDrainPackageGPS, highestDrainPackageWIFI);

    //Update the table
    updateTable(cpu_values, gps_values, wifi_values, highestDrainPackageCPU, highestDrainPackageGPS, highestDrainPackageWIFI);

}

在我尝试创建一个新线程来完成服务内部的繁重工作之前,我的 Activity 已成功更新。

最佳答案

编辑:抱歉,我想我早些时候注意到了它,并且被处理程序跟踪了。

您创建了线程 t,但您从未运行过它。

t.start();

您将 handleMessage() 定义为处理程序的方法,如下所示:

handler = new Handler() {

    @Override
    public void handleMessage(Message msg) {

        //TODO: Handle different types of messages

   }
};

关于具有处理程序和线程的 Android 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21217147/

相关文章:

android - 一个应用多个品牌

java - 队列的线程安全映射

android - 我可以使用 greenrobot EventBus 在 Activity 和 Service 之间进行通信吗?

android - 无法使用 NotificationListenerService 取消通知

安卓 L (API 21) - java.lang.IllegalArgumentException : Service Intent must be explicit

javascript函数没有在android webview中被调用

android - 如何在unity android中缓存图像?

android - 带文本 x 轴的条形图 - achartengine

java - 多线程环境下的单例模式

java - 计数器应用程序不会停止