繁体   English   中英

活动挂在TextView.setText()上

[英]Activity hangs on TextView.setText()

代码优先:

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;
          }   
     }
}

上面的代码只是向服务器发送一些消息并接收答案。 然后,此答案应显示在TextView中(请参见标记的行)。 但是,该应用程序挂在该行,即LogCat显示

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

然后,不再将任何行写入LogCat。 有人对此有解释吗? 如果标记的行被注释掉,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线程更新。

首先按照以下步骤初始化文本视图,然后在doInBackground方法下面添加onPostExecute方法。 并在此处设置文字。 波纹管是我更改的代码。

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