简体   繁体   English

活动挂在TextView.setText()上

[英]Activity hangs on TextView.setText()

Code first: 代码优先:

public class MyActivity extends Activity {

    Button   send;
    TextView textv;
    String   answer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.my_activity);

        send  = (Button)findViewById(R.id.sendButton);
        textv = (TextView)findViewById(R.id.textViewv);

        send.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {       
                MyClientTask myClientTask = new MyClientTask("localhost", 1234, "QUESTION");
                myClientTask.execute();
            }
        });     
    }


    void processAnswer() {
        Log.i("DEBUG", "in processAnswer - before setting text");
        Log.i("DEBUG", "ANSWER");

        textv.setText("ANSWER\n");  // <-------- H E R E -----------

        Log.i("DEBUG", "in processAnswer - after setting text");
    }



    public class MyClientTask extends AsyncTask<Void, Void, Void> {

          String dstAddress;
          int dstPort;

          String message;
          String response;

          MyClientTask(String addr, int port, String msg){
           dstAddress = addr;
           dstPort    = port;
           message    = msg;
           response   = "";
          }

          @Override
          protected Void doInBackground(Void... arg0) {

           Socket socket = null;   

            try {
                InetAddress serverAddr = InetAddress.getByName(dstAddress);

                socket = new Socket(serverAddr, dstPort);
                OutputStream out = socket.getOutputStream();     
                out.write(message.getBytes());
                out.flush();

                String msgrc = "";
                int charsRead = 0;
                char[] inputBuf = new char[4096];

                InputStream is = socket.getInputStream();
                InputStreamReader isr = new InputStreamReader(is);
                BufferedReader in = new BufferedReader(isr);
                while ((charsRead = in.read(inputBuf)) != -1) {
                        msgrc += new String(inputBuf).substring(0, charsRead);
                }

                // outer class variable
                MyActivity.this.answer = msgrc;

                out.close();
                is.close();
                socket.close();


                Log.i("DEBUG", "before processing answer");
                MyActivity.this.processAnswer();
                Log.i("DEBUG", "after processing answer");

            } catch (Exception e) {

            }

            return null;
          }   
     }
}

The code above simply sends some message to a server and receives an answer. 上面的代码只是向服务器发送一些消息并接收答案。 This answer should then be displayed in the TextView (see marked line). 然后,此答案应显示在TextView中(请参见标记的行)。 However, the app hangs at that line, ie, LogCat displays 但是,该应用程序挂在该行,即LogCat显示

[...]
before processing answer
in processAnswer - before setting text
ANSWER

Then no more lines are written to LogCat. 然后,不再将任何行写入LogCat。 Has anybody an explanation for that? 有人对此有解释吗? If the marked line is commented out, LogCat looks like 如果标记的行被注释掉,LogCat看起来像

[...]
before processing answer
in processAnswer - before setting text
ANSWER
in processAnswer - after setting text
after processing answer

如果您移动调用MyActivity.this.processAnswer()onPostExecute()代替,也许是可能的工作- IIRC,UI线程上的项目只能从UI线程更新。

First inialize your text view by following , then add onPostExecute method bellow the doInBackground method . 首先按照以下步骤初始化文本视图,然后在doInBackground方法下面添加onPostExecute方法。 And set your text there . 并在此处设置文字。 Bellow is code which i change. 波纹管是我更改的代码。

public class MyActivity extends Activity {

Button   send;
TextView textv;
String   answer;

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.my_activity);

    send = (Button)findViewById(R.id.sendButton);
    textv = (TextView)findViewById(R.id.textview);

    send.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {       
            MyClientTask myClientTask = new MyClientTask("localhost", 1234, "QUESTION");
            myClientTask.execute();
        }
    });     
}



public class MyClientTask extends AsyncTask<Void, Void, Void> {

      String dstAddress;
      int dstPort;

      String message;
      String response;

      MyClientTask(String addr, int port, String msg){
       dstAddress = addr;
       dstPort    = port;
       message    = msg;
       response   = "";
      }

      @Override
      protected Void doInBackground(Void... arg0) {

       Socket socket = null;   

        try {
            InetAddress serverAddr = InetAddress.getByName(dstAddress);

            socket = new Socket(serverAddr, dstPort);
            OutputStream out = socket.getOutputStream();     
            out.write(message.getBytes());
            out.flush();

            String msgrc = "";
            int charsRead = 0;
            char[] inputBuf = new char[4096];

            InputStream is = socket.getInputStream();
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader in = new BufferedReader(isr);
            while ((charsRead = in.read(inputBuf)) != -1) {
                    msgrc += new String(inputBuf).substring(0, charsRead);
            }

            // outer class variable
            MyActivity.this.answer = msgrc;

            out.close();
            is.close();
            socket.close();


            Log.i("DEBUG", "before processing answer");
            MyActivity.this.processAnswer();
            Log.i("DEBUG", "after processing answer");

        } catch (Exception e) {

        }

        return null;
      }   


      @Override
    protected void onPostExecute(Void result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);

        textv.setText(msgrc);

    }   
 }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM