如何在Handler中访问变量?将它们公开不起作用

时间:2014-04-07 00:49:33

标签: java android multithreading handler

我不知道如何在另一个方法中使用来自另一个处理程序的变量。我试图将这些变量(readBuf,readMessage和msg)设置为公共,但这不起作用。如何在单独的方法中访问这些变量?我希望列出的变量包括.arg1和.obj在另一个处理程序中。

注释掉的代码是最初处理数据的地方。

    public Handler handler;
    public byte[] readBuf; 
    public String readMessage;
    public Object msg;

    handler = new Handler();

    private final Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
            case MESSAGE_STATE_CHANGE:
                if(D) Log.i(TAG, "MESSAGE_STATE_CHANGE: " + msg.arg1);
                switch (msg.arg1) {
            case MESSAGE_READ:
                       //for(int a = 0; a< 8000; a++)
                       //{
                       try
                        {
                        byte[] readBuf = (byte[]) msg.obj;
                        String readMessage = new String(readBuf,0,msg.arg1);
                        mConversationArrayAdapter.add("Voltage: "+ readMessage);
                        //double[] convert = new double[1];
                        //for(int z=0; z <1;z++)
                        //{
                        //convert[z]= Double.parseDouble(readMessage);
                        //}
                        //for(int j=0; j<1;j++)
                        //{
                        //stored[a][j]= convert[j];
                        //}
                        //}
                        catch(NumberFormatException e)
                        {
                         System.err.println("NumberFormatException: "+e.getMessage());
                        }
                        //}
                break;
            }
        }
    };

    public void process()
    {
        new Thread(new Task()).start();
    }

    class Task implements Runnable
    {
        @Override
        public void run() 
        {
                try{
                    Thread.sleep(1000);
                }
                catch(InterruptedException e)
                {
                    e.printStackTrace();
                }
                handler.post(new Runnable()
                {
                    @Override
                    public void run(){
                        for(int a = 0; a< 8000; a++)
                        {
                        byte[] readBuf = (byte[]) msg.obj;//ERROR with .obj
                        try
                        {
                        String readMessage = new String(readBuf,0,msg.arg1);// Error with .arg1
                        mConversationArrayAdapter.add("Voltage: "+ readMessage);
                        double[] convert = new double[1];
                        for(int z=0; z <1;z++)
                        {
                        convert[z]= Double.parseDouble(readMessage);
                        }
                        for(int j=0; j<1;j++)
                        {
                        stored[a][j]= convert[j];
                        }
                        }
                        catch(NumberFormatException e)
                        {
                         System.err.println("NumberFormatException: "+e.getMessage());
                        }
                        }


                    }
                });
        }

    }
}

2 个答案:

答案 0 :(得分:0)

我在其他方法中使用对象变量的方法是将新的公共静态变量设置为等于对象变量。这样我就可以在其他方法中使用它们。

答案 1 :(得分:0)

您必须创建一个消息并按处理程序发送,而不是“共享”变量。

Message msg = new Message();
msg.what = ...;
msg.obj  = ...;
....
handler.sendMessage(msg);