首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Android上顺序运行java线程

如何在Android上顺序运行java线程
EN

Stack Overflow用户
提问于 2012-12-18 16:08:12
回答 2查看 2K关注 0票数 4

我有7个声纳传感器,我的目标是在Android平板电脑上依次显示这些传感器值。

为了在平板屏幕上动态显示传感器值,我使用了Runnables。

然而,如果声纳传感器并行工作,则会造成声纳传感器之间的干扰。因此,我需要让他们按顺序工作。

我的问题是:可以使用线程顺序在Android平板电脑上显示传感器值吗?

虽然我使用了join()sleep(),但传感器仍然互相干扰。当我尝试使用等待和通知时,应用程序会出现内存不足异常。我也试图使用同步方法,但它没有影响它。

下面你可以看到我的代码。

代码语言:javascript
复制
package com.dinning;

import android.widget.TextView;

public class Dinning implements Runnable 
{
    public Interfacekit diningkit;
    public TextView[] Rfidviews; 
    int count=1;

    public Dinning(Interfacekit diningkit,Rfid drfid1,Rfid drfid2, Rfid drfid3,Rfid drfid4,Rfid drfid5,Rfid drfid6,Rfid fsrfid1,Rfid fsrfid2,Rfid fsrfid3,final TextView[] Rfidviews)
    {
        this.diningkit = diningkit;
        this.Rfidviews = Rfidviews;
        new Thread(this).start();
    }

    public void run()       
    {
        while(count==1)
        {   
            if(diningkit.getattach()==true)
            {
                Thread t1 = new Thread(new Runnable() 
                {  
                    public void run() 
                    {
                        Rfidviews[11].post(new Runnable() 
                        {
                            public void run() 
                            {
                                {
                                    int sonar0 = diningkit.getsonar(7);
                                    if(sonar0!=0)
                                        Rfidviews[11].setText("Port0:"+sonar0);
                                    else
                                        Rfidviews[11].setText(" ");
                                }            
                            }
                        });
                    }
                });

                Thread t2 = new Thread(new Runnable() {  
                    public void run() {
                        Rfidviews[12].post(new Runnable() 
                        {
                            public void run() 
                            {
                                {
                                    int sonar1 = diningkit.getsonar(6);
                                    if(sonar1!=0)
                                        Rfidviews[12].setText("Port1:"+sonar1);
                                    else
                                        Rfidviews[12].setText(" ");
                                }            
                            }
                        });
                    }
                });

                Thread t3 = new Thread(new Runnable() 
                {  
                    public void run() 
                    {
                        Rfidviews[13].post(new Runnable() 
                        {
                            public void run() 
                            {
                                {
                                    int sonar2 = diningkit.getsonar(5);     
                                    if(sonar2!=0)
                                        fidviews[13].setText("Port2:"+sonar2);
                                    else
                                        Rfidviews[13].setText(" ");
                                }        
                            }
                        });
                    }       
                });

                t1.start();
                t2.start();
                t3.start();
            } 
        }//while        
    }           
}





 package com.dinning;



import android.app.Activity;
import android.content.Context;
import com.phidgets.InterfaceKitPhidget;
import com.phidgets.Phidget;
import com.phidgets.PhidgetException;
import com.phidgets.event.AttachEvent;
import com.phidgets.event.AttachListener;
import com.phidgets.event.DetachEvent;
import com.phidgets.event.DetachListener;
import com.phidgets.event.InputChangeEvent;
import com.phidgets.event.InputChangeListener;
import com.phidgets.event.SensorChangeEvent;
import com.phidgets.event.SensorChangeListener;

public class Interfacekit {

    int status=1;
    InterfaceKitPhidget ik;
    public boolean attach = false;
    public Phidget phidget;
    int value = 0;
    int index = 0;
    int serial;

    int value0,value1,value2,value3,value4,value5,value6,value7,valport;
    int sonarvalue0,sonarvalue1,sonarvalue2,sonarvalue3,sonarvalue4,sonarvalue5,sonarvalue6,sonarvalue7;
    int curVal;

    public Interfacekit(final Context con,final Activity act,int serial)
    {
        this.serial = serial;

        try
        {
            com.phidgets.usb.Manager.Initialize(con);
            ik = new InterfaceKitPhidget();



            ik.addAttachListener(new AttachListener() {
                public void attached(final AttachEvent ae)
                {
                    act.runOnUiThread(new Runnable() {

                        public void run() {
                            try{
                            attach=true;    

                            value0= ik.getSensorValue(0);
                            value1= ik.getSensorValue(1);
                            value2= ik.getSensorValue(2);
                            value3=ik.getSensorValue(3);
                            value4=ik.getSensorValue(4);
                            value5= ik.getSensorValue(5);
                            value6= ik.getSensorValue(6);
                            value7= ik.getSensorValue(7);


                            }catch(Exception e){}
                        }

                    });




                }
            });



            ik.addDetachListener(new DetachListener() {
                public void detached(final DetachEvent ae) {

                    attach = false;
                    phidget = ae.getSource();
                    act.runOnUiThread(new Runnable() {

                        public void run() {

                        }
                    });
                }
            });


            ik.addSensorChangeListener(new SensorChangeListener() {
                public void sensorChanged(SensorChangeEvent se) {  //final Sensorchangeevent


                    value = se.getValue();
                    index = se.getIndex();



                    try {

                        sonarvalue0=ik.getSensorValue(0);
                        sonarvalue1=ik.getSensorValue(1);
                        sonarvalue2=ik.getSensorValue(2);
                        sonarvalue3=ik.getSensorValue(3);
                        sonarvalue4=ik.getSensorValue(4);
                        sonarvalue5=ik.getSensorValue(5);
                        sonarvalue6=ik.getSensorValue(6);
                        sonarvalue7=ik.getSensorValue(7);





                    } catch (PhidgetException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }









                }



            });




            ik.addInputChangeListener(new InputChangeListener() {
                public void inputChanged(final InputChangeEvent ie) {



                }
            });
            ik.open(serial);

        }
        catch(Exception e){}
    }



        public boolean getattach()
        {

         return attach ;    
        }

        /* Sonar*/

        public int getsonar(int digitalOutput){

            int curVal,result = 0;


            if(5==digitalOutput){



                    try {
                        ik.setOutputState(digitalOutput, true);

                    } 
                    catch (PhidgetException e) {

                    e.printStackTrace();
                    }



                    curVal=(int) (1.296*sonarvalue2);

                    if(curVal>0 && curVal<60){
                        result=curVal;
                        System.out.println("Port2: "+result);
                    }
                    else if (curVal>60)
                        result=0;



            }

            else if(6==digitalOutput){



                try {
                    ik.setOutputState(digitalOutput, true);

                } 
                catch (PhidgetException e) {

                e.printStackTrace();
                }



                curVal=(int) (1.296*sonarvalue1);

                if(curVal>0 && curVal<80)
                    result=curVal;

                else if(curVal>80) 
                    result=0;



            }


            else if(7==digitalOutput){



                try {
                    ik.setOutputState(digitalOutput, true);

                } 
                catch (PhidgetException e) {

                e.printStackTrace();
                }



                curVal=(int) (1.296*sonarvalue0);

                if(curVal>0 && curVal<50)
                    result=curVal;

                else if(curVal>50)
                    result=0;



            }

            return result;

    }





        /* End Sonar*/



}
EN

回答 2

Stack Overflow用户

发布于 2012-12-18 16:16:58

在ExecutorService包中使用java.util.concurrent。特别是Executors.newSingleThreadExecutor();

newSingleThreadExecutor 公共静态ExecutorService newSingleThreadExecutor()创建一个执行器,该执行器使用一个工作线程在一个无限制队列上操作。(但是,请注意,如果此单个线程由于关闭前执行期间的失败而终止,则如果需要执行后续任务,将由一个新线程代替。)任务保证按顺序执行__,并且在任何给定时间都不会有多个任务处于活动状态。与其他等价的newFixedThreadPool(1)不同,返回的执行器保证不会被重新配置为使用其他线程。

也是

代码语言:javascript
复制
t1.start();
t1.join();
t2.start();

等一下,当另一个人死的时候,开始一个。然而,我认为根本不需要线程。不必要的复杂和违背他们的设计目的?

票数 3
EN

Stack Overflow用户

发布于 2012-12-18 16:18:43

而不是

代码语言:javascript
复制
Thread t1 = new Thread(new Runnable() {  
                public void run() {
                   //do something
                }
            });

它在线程中运行run()方法。

试一试

代码语言:javascript
复制
(new Runnable() {  
    public void run() {
        //do something
    }
 }).run();

它创建匿名Runnable并直接调用其run() (而不是通过Thread),因此按顺序执行。

编辑0:没有明确的理由,您似乎有很多ThreadRunnable。我认为这段代码应该是等价的,但是简化了许多ThreadRunnable的内容,这使得阅读起来很混乱:

代码语言:javascript
复制
package net.ukims.dsp.cid.dataaccess;

import android.widget.TextView;

public class Dinning implements Runnable {
    public Interfacekit diningkit;
    public TextView[] Rfidviews;
    int count = 1;

    public Dinning(Interfacekit diningkit, Rfid drfid1, Rfid drfid2,
            Rfid drfid3, Rfid drfid4, Rfid drfid5, Rfid drfid6, Rfid fsrfid1,
            Rfid fsrfid2, Rfid fsrfid3, final TextView[] Rfidviews) {
        this.diningkit = diningkit;
        this.Rfidviews = Rfidviews;
        run();
    }

    public void run() {
        while (count == 1) {
            if (diningkit.getattach() == true) {
                Rfidviews[11].post(new Runnable() {
                    public void run() {
                        {
                            int sonar0 = diningkit.getsonar(7);
                            if (sonar0 != 0)
                                Rfidviews[11].setText("Port0:" + sonar0);
                            else
                                Rfidviews[11].setText(" ");
                        }
                    }
                });

                Rfidviews[12].post(new Runnable() {
                    public void run() {
                        {
                            int sonar1 = diningkit.getsonar(6);
                            if (sonar1 != 0)
                                Rfidviews[12].setText("Port1:" + sonar1);
                            else
                                Rfidviews[12].setText(" ");
                        }
                    }
                });

                Rfidviews[13].post(new Runnable() {
                    public void run() {
                        {
                            int sonar2 = diningkit.getsonar(5);
                            if (sonar2 != 0)
                                fidviews[13].setText("Port2:" + sonar2);
                            else
                                Rfidviews[13].setText(" ");
                        }
                    }
                });             
            }
        }// while
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13936969

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档