Тема не прерывается - PullRequest
       16

Тема не прерывается

0 голосов
/ 06 июня 2019

Я работаю на Crate Server и Android-клиент но поток не прерывается клиентом Android Мой Android-клиент запросил RoomList с сервера и сервер получают, клиент принимает и заполнить мой ListView использовал адаптер вот проблема, если нажать кнопку назад, чем RoomListAcitivity была закрыта и поток был остановлен но поток не останавливается только в моем приложении Первый Enter успешно работает но нажмите BackButton on и снова введите эту активность MyApp просто белый, без действий как я могу остановить эту тему? (и извините за мой английский ...)

я попробовал метод .interrupt () и handler.removeMessages (0) но потерпевший неудачу поток остается в живых

загрузите этот полный код Java на всякий случай ...

   ListView roomList;
    RoomAdapter roomAdapter;
    Socketservice ss;
    String msg,rtitle;
    String msgs[];
    String list[];
    Thread listthread,EnterRoomThread,removeV;
    boolean staterun = true;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list_room);

        roomList = findViewById(R.id.roomList);
        roomAdapter = new RoomAdapter();

        listthread = new Thread() {
            public void run(){
                        ss.out.println("163|");
                        ss.out.println("100|");
                try {
                    while (staterun == true) {
                            msg = ss.in.readLine();
                            handler.post(new Runnable() {
                                public void run() {
                                    msgs = msg.split("\\|");
                                    String protocol = msgs[0];
                                    switch (protocol) {
                                        case "163":
                                            list = msgs[1].split(",");
                                            for (int i = 0; i < list.length; i++) {
                                                String list1[] = list[i].split("-");
                                                String listT = list1[0];
                                                int listC = Integer.parseInt(list1[1]);
                                                int listI = Integer.parseInt(list1[2]);
                                                roomAdapter.CreateRoom(listI, listT, listC);
                                            }
                                                roomList.setAdapter(roomAdapter);
                                                msg = "";
                                                msgs = null;
                                                break;
                                        case "200":
                                            Intent i = new Intent(getApplicationContext(), GameWaitingActivity.class);
                                            i.putExtra("tname", rtitle);
                                            staterun = !staterun;
                                            Toast.makeText(getApplicationContext(),""+listthread.isAlive(),Toast.LENGTH_SHORT).show();
                                            startActivity(i);
                                            finish();
                                            break;
                                        case "201":
                                            Toast.makeText(getApplicationContext(), "방이 꽉 찼습니다.", Toast.LENGTH_SHORT).show();
                                            break;
                                    }
                                }
                            });
                    }
                } catch (IOException e) {

                }
            }
        };
        listthread.start();

        roomList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Room item = (Room) roomList.getItemAtPosition(position);
                rtitle=item.getTitle();
                EnterRoomThread = new Thread() {
                    public void run() {
                        ss.out.println("200|" + rtitle);
                        EnterRoomThread.interrupt();
                    }
                };
                EnterRoomThread.start();
        }


    });

    }

    Handler handler = new Handler();




    @Override
    public void onBackPressed() {
        removeV = new Thread() {
            public void run(){
                ss.out.println("101|");
                removeV.interrupt();
            }
        };
        removeV.start();
        handler.removeMessages(0);
        staterun = false;
        listthread.interrupt();
        Toast.makeText(getApplicationContext(),""+listthread.isAlive(),Toast.LENGTH_SHORT).show();
        finish();
    }
}

1 Ответ

0 голосов
/ 06 июня 2019

Вперед, напишите это внутри метода run ()

    //use this boolean value to keep track.
    boolean shouldRunFlag = true;
    while (shouldRunFlag) {
            try {
                Thread.sleep(10);  

                //Do your work............

            } catch (Exception e) {
                e.printStackTrace();
                Log.v(TAG, "Interrupted Exception caught");

                // change the flag, so that while loop can be broken.

                shouldRunFlag = false;
                Log.v(TAG, "run: breaking the loop");
                break;
            }

    }

и вот как вы прерываете и очищаете поток

 private void interrupt(Thread currentThread) {
        Log.i(TAG, "interrupt");
        if (currentThread != null) {
            Thread dummyThread = currentThread;
            dummyThread.interrupt();
            currentThread = null;
        }
    }   
...