samedi 27 juin 2015

using of long touch and multi thread programming

I have a problem in using of long touch and multi thread programming.

I have 2 button: up and down. Each of these buttons have OnTouchListener event habdler . When I touch down in each of them, a thread will run inside them in the while(HelperClass.Universal_IsTouch == true) and in every 1000 milisec run again until tuouch up raised and "HelperClass.Universal_IsTouch" make false in touch up and it exit from the while .

in the while loop a thrad run and call another class method for sending data via run another thread via socket programming . So then when up button (or down) touched down long time , data should be send to server until touched up raised.

Its working but after many sending up and down when I touch long up (or down) its sended data related to other routin instead main routin ?

this is my UP routin code :

//////////// up 
            btn_UP_var.setOnTouchListener(new View.OnTouchListener() {

                @Override
                public boolean onTouch(View arg0, MotionEvent arg1) {

                    IntruptedAllThread();

                    // TODO Auto-generated method s tub
                    if (arg1.getAction() == MotionEvent.ACTION_DOWN)
                    {
                        HelperClass.Universal_IsTouch = true;

                    } else if (arg1.getAction() == MotionEvent.ACTION_UP) {

                        HelperClass.Universal_IsTouch = false;

                    }

                    //Send a simple Move (once)
                    if (chkbx_AutoMove_var.isChecked()) {
                        Img_Stop_var.setImageResource(R.drawable.arrow_stop_play);
                        Is_UP_buttonTouched = 1;
                        HelperClass.Is_Stop_Button_Disable = false;

                    } else {
                        HelperClass.Is_Stop_Button_Disable = true;

                        thread_UP = new Thread(new Runnable() {

                            @Override
                            public void run() {
                                while (HelperClass.Universal_IsTouch == true) {

                                    Cursor ListHoist = mDbHelper.GetallSelectedHoistData();
                                    //mDbHelper.close();
                                    for (ListHoist.moveToFirst(); !ListHoist.isAfterLast(); ListHoist.moveToNext()) {
                                        String IP = ListHoist.getString(ListHoist.getColumnIndex("HoistIP"));
                                        int PK_hoist = ListHoist.getInt(ListHoist.getColumnIndex("PK_hoist"));

                                        HelperClass.SendDataToMICRO(mDbHelper, PK_hoist, IP, HelperClass.Selector_Move_Stop,
                                                HelperClass.MoveDesition_Up, HelperClass.inutile, HelperClass.inutile,
                                                HelperClass.inutile);
                                    }
                                    ListHoist.close();

                                    try {
                                        Thread.sleep(1000);
                                    }
                                    catch (InterruptedException e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                        IntruptedAllThread();

                                    }
                                }
                                // thread_UP.interrupt();
                                IntruptedAllThread();

                            }
                        });
                        thread_UP.start();
                    }

                    return true;
                }
            });

and this is my Down Code :

 //////////// Down 
            btn_Down_var.setOnTouchListener(new View.OnTouchListener() {

                @Override
                public boolean onTouch(View arg0, MotionEvent arg1) {
                    // TODO Auto-generated method stub

                    IntruptedAllThread();

                    if (arg1.getAction() == MotionEvent.ACTION_DOWN)
                    {
                        HelperClass.Universal_IsTouch = true;
                        //txt_MovementValue_var.setText("1");

                    } else if (arg1.getAction() == MotionEvent.ACTION_UP)
                    {
                        HelperClass.Universal_IsTouch = false;

                        //txt_MovementValue_var.setText("0");
                    }

                    //Send a simple Move (once)
                    if (chkbx_AutoMove_var.isChecked()) {
                        Img_Stop_var.setImageResource(R.drawable.arrow_stop_play);
                        Is_UP_buttonTouched = 0;
                        HelperClass.Is_Stop_Button_Disable = false;

                    } else {
                        HelperClass.Is_Stop_Button_Disable = true;
                        thread_Down = new Thread(new Runnable() {

                            @Override
                            public void run() {
                                while (HelperClass.Universal_IsTouch == true) {

                                    Cursor ListHoist = mDbHelper.GetallSelectedHoistData();
                                    for (ListHoist.moveToFirst(); !ListHoist.isAfterLast(); ListHoist.moveToNext()) {
                                        String IP = ListHoist.getString(ListHoist.getColumnIndex("HoistIP"));
                                        int PK_hoist = ListHoist.getInt(ListHoist.getColumnIndex("PK_hoist"));

                                        HelperClass.SendDataToMICRO(mDbHelper, PK_hoist, IP, HelperClass.Selector_Move_Stop,
                                                HelperClass.MoveDesition_Down, HelperClass.inutile, HelperClass.inutile,
                                                HelperClass.inutile);
                                    }
                                    ListHoist.close();

                                    try {
                                        Thread.sleep(1000);
                                    }
                                    catch (InterruptedException e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                        IntruptedAllThread();

                                    }
                                }
                                //thread_Down.interrupt();
                                IntruptedAllThread();

                            }
                        });
                        thread_Down.start();
                    }

                    return true;
                }
            });

this is IntruptedAllThread()

    public void IntruptedAllThread() {
    if (thread_UP != null) {
        thread_UP.interrupt();
        thread_UP = null;
    }
    if (thread_Down != null) {
        thread_Down.interrupt();
        thread_Down = null;
    }
}

and this is my thread to send data socket :

//This get each hoist data and change it to 
//Int array to send to micro 
public static void SendDataToMICRO(dbAdapter mDbHelper, int HoistID, final String Server_IP, int firstByte_KindType, int secoundByte_KindofMove,
                                   int ValueOfMove, int valueOfsetting, int MaxOrMinValue) {
    //        mDbHelper = new dbAdapter(G.context);
    //        mDbHelper.createDatabase();
    //        mDbHelper.open();
    Server_Port = mDbHelper.GetPortNumber();
    //mDbHelper.close();

    final String Concatinate_values = firstByte_KindType + Spliter + secoundByte_KindofMove +
            Spliter + ValueOfMove + Spliter + valueOfsetting + Spliter + MaxOrMinValue;

    //Sent Routin
    ////‌Connect To server

    Thread thread = null;

    thread = new Thread(new Runnable() {

        @Override
        public void run() {

            DataOutputStream outputStream = null;
            BufferedReader inputStream = null;
            Socket socket;
            socket = new Socket();

            try {

                socket.connect(new InetSocketAddress(Server_IP, Server_Port), 10);

            }
            catch (IOException e2) {
                // TODO Auto-generated catch block
                e2.printStackTrace();
                Thread.currentThread().interrupt();
            }

            ////Make Read Line
            try {
                outputStream = new DataOutputStream(socket.getOutputStream());

                inputStream = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            }
            catch (IOException e1) {
                //Finished Socket

                ShutDown(socket);
            }

            if (outputStream == null) {
                //
                ShutDown(socket);
                Thread.currentThread().interrupt();
                return;
            }

            //Write Message
            try {
                String message = Concatinate_values + "\n";

                outputStream.write(message.getBytes());
                outputStream.flush();

                ShutDown(socket);
                Thread.currentThread().interrupt();
                return;

            }
            catch (IOException e) {
                e.printStackTrace();
                Thread.currentThread().interrupt();

            }

            try {
                if (socket != null) {
                    socket.close();

                }
            }
            catch (IOException e) {
                e.printStackTrace();
                ShutDown(socket);
                Thread.currentThread().interrupt();
                return;
            }
            Thread.currentThread().interrupt();
        }
    });

    thread.start();

}

enter image description here

result

enter image description here

Aucun commentaire:

Enregistrer un commentaire