线程中的Android bug

时间:2013-09-11 10:03:26

标签: java android multithreading

我正在开发一个通过套接字与服务器连接的Android测验应用程序。在客户端(Android设备),我在一个while循环中检查服务器(Java服务器)给出的答案。连接和接收的答案都很顺利。问题是我班上检查答案有一个错误。为了提供更多信息,我将在此处包含部分代码:

public void startClient(){

    checkValue = new Thread(new Runnable(){
        @Override
        public void run() {     
            try
            {
                final int PORT = 4444;
                final String HOST = "192.168.1.118";
                Socket SOCK = new Socket(HOST, PORT);
                Log.e("success", "You connected to: " + HOST);

                quizClient = new QuizClient(SOCK);

                //Send the groupname to the list
                PrintWriter OUT = new PrintWriter(SOCK.getOutputStream());
                OUT.println(groupName);
                OUT.flush();

                Thread X = new Thread(quizClient);
                X.start();

                connected = true;


            }
            catch(Exception X)
            {
                Log.e("connection error", "Error: ", X);
            }       
        }
    });

    checkValue.start(); 

}

public void testvalue(){

    Thread thread = new Thread(new Runnable(){
        @Override
        public void run() {
            try {
                while(true){
                    if(message != null && !message.matches("")){
                        Thread.sleep(1000);
                        Log.e("receive", message);
                        buffer = message;
                        message = "";

                        Message msg = new Message();
                        String textTochange = buffer;
                        msg.obj = textTochange;
                        mHandler.sendMessage(msg);
                        Thread.sleep(3000);
                    }

                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });

    thread.start();

}

Handler mHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {

        String text = (String)msg.obj;
        //call setText here

        //String[] myStringArray = new String[]; 
        value.clear();

        String[] items = text.split(";");
        for (String item : items)
        {
            value.add(item);
            Log.e("message", item);
            //System.out.println("item = " + item);
        }

        if(value.get(0).equals("1")){

            questionGroup.setVisibility(View.INVISIBLE);
            sendAnswer.setVisibility(View.INVISIBLE);
            answer.setVisibility(View.INVISIBLE);
            question.setText("");


            question.setText(value.get(2));
            rad1.setText(value.get(3));
            rad2.setText(value.get(4));
            rad3.setText(value.get(5));
            rad4.setText(value.get(6));

            questionGroup.setVisibility(View.VISIBLE);
            sendAnswer.setVisibility(View.VISIBLE);


        } else if (value.get(0).equals("2")){

            questionGroup.setVisibility(View.INVISIBLE);
            sendAnswer.setVisibility(View.INVISIBLE);
            answer.setVisibility(View.INVISIBLE);

            question.setText("");
            question.setText(value.get(2));
            answer.setVisibility(View.VISIBLE);
            sendAnswer.setVisibility(View.VISIBLE);


        } else
        {
            questionGroup.setVisibility(View.INVISIBLE);
            sendAnswer.setVisibility(View.INVISIBLE);
            answer.setVisibility(View.INVISIBLE);

            question.setText(text);
        }


    }
};

@Override
protected void onStop() 
{

    if (connected == true){
        try {
            quizClient.DISCONNECT();
        } catch (IOException e) {
            e.printStackTrace();
        }   
    }

    if(checkValue != null)
    {
        checkValue.interrupt();
    }

    super.onStop();
    closeApplication();

}

所以我创建了这个类的新实例(我实际上检查了传入的数据流)

public class QuizClient implements Runnable {

//Globals 
Socket SOCK;
Scanner INPUT;
Scanner SEND = new Scanner(System.in);
PrintWriter OUT;

public QuizClient(Socket X)
{
    this.SOCK = X;
}

public void run()
{
    try
    {
        try
        {
            INPUT = new Scanner(SOCK.getInputStream());
            OUT = new PrintWriter(SOCK.getOutputStream());
            OUT.flush();
            CheckStream();
        }
        finally
        {
            SOCK.close();
        }
    }
    catch(Exception X)
    {
        Log.e("error", "error: ", X);
    }
}

public void DISCONNECT() throws IOException
{
    OUT.println("DISCONNECT");
    OUT.flush();
    SOCK.close();
}

public void CheckStream()
{
    while(true)
    {
        RECEIVE();
    }
}

public void RECEIVE()
{

    if(INPUT.hasNext())
    {
        String MESSAGE = INPUT.nextLine();

        if(MESSAGE.contains("#?!"))
        {

        }
        else
        {
            QuizActivity.message = MESSAGE;
            Log.e("test", MESSAGE);
        }
    }
}

public void SEND(String X)
{
    OUT.println(X);
    OUT.flush();
}
}

所以我想在下面的课程中仍然存在这个错误:

public void testvalue(){

    Thread thread = new Thread(new Runnable(){
        @Override
        public void run() {
            try {
                while(true){
                    if(message != null && !message.matches("")){
                        Thread.sleep(1000);
                        Log.e("receive", message);
                        buffer = message;
                        message = "";

我在这里做的是创建一个线程并检查“message”是否等于null。该消息来自其他类:

public void RECEIVE()
{

    if(INPUT.hasNext())
    {
        String MESSAGE = INPUT.nextLine();

        if(MESSAGE.contains("#?!"))
        {

        }
        else
        {
            QuizActivity.message = MESSAGE;

现在大部分时间这都很好,但有2个问题。当我离开页面时它断开与服务器的连接(工作)我回到页面并再次连接到服务器但这次我没有在屏幕上获得任何值(接收是okj但是对于其中一个因为它在我的处理程序中不顺利)。在一段时间后也获得indexoutofboundexception:

question.setText(value.get(2));

程序运行时会出现第二个问题。有些时候我也没有在我的界面上获得正确接收输入的值。

所以我的猜测是,我读取值的线程解决方案并不是处理它的最佳方法。所以现在我向有经验的人询问我能做些什么才能使这项工作没有重大问题?您需要知道连接是否正常,我在QuizClient类中获取了值。所以问题需要在我的主要课堂上。

我的oncreate课程:

    @Override
protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_quiz);

    selectgroep = (Spinner) findViewById(R.id.groepen);
    questionGroup = (RadioGroup) findViewById(R.id.QuestionGroup);
    sendAnswer = (Button) findViewById(R.id.sendAnswer);

    rad1 = (RadioButton) findViewById(R.id.radio0);
    rad2 = (RadioButton) findViewById(R.id.radio1);
    rad3 = (RadioButton) findViewById(R.id.radio2);
    rad4 = (RadioButton) findViewById(R.id.radio3);

    answer = (EditText) findViewById(R.id.textanswer);

    questionGroup.setVisibility(View.INVISIBLE);
    sendAnswer.setVisibility(View.INVISIBLE);
    answer.setVisibility(View.INVISIBLE);


    try {
        connect();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    //Code na het drukken op de knop
    startserver = (Button) findViewById(R.id.startserver);
    startserver.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            startClient();
            getID();
            testvalue();
        }

});

    sendAnswer.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // Stuur antwoord door en sluit alles af 
            questionGroup.setVisibility(View.INVISIBLE);
            sendAnswer.setVisibility(View.INVISIBLE);
            answer.setVisibility(View.INVISIBLE);
            answer.setText("");

            rad1.setChecked(true);
            rad1.setText("");
            rad2.setText("");
            rad3.setText("");
            rad4.setText("");

            question.setText("Wachten op server ... ");

        }
    });

}

提前谢谢你, Thomas Thooft

0 个答案:

没有答案