【问题标题】:Android application not reading from Socket input streamAndroid 应用程序未从 Socket 输入流中读取
【发布时间】:2020-07-19 02:53:01
【问题描述】:

由于某种原因,我的 android 应用程序没有从我的服务器接收任何数据。奇怪的是,我编写的一个不同的套接字客户端(它在我的计算机上运行,​​而不是在 AVD 上运行)接收并打印所有服务器发送的消息而没有错误。它使用与doInBackground 方法中的代码类似的代码。

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

    int port;
    Socket s;

    @Override
    protected Void doInBackground(Void... voids) {
        try {
            port = 1818;
            s = new Socket("xx.xx.xx.xx", port);
            if (!s.isConnected()) {
                s.close();
            }

            BufferedReader re = new BufferedReader(new InputStreamReader(s.getInputStream()));
            String temp = null;

            while ((temp = re.readLine()) != null)
            {
                MainActivity.changeT(temp); // This will replace the TextView's text with temp.
            }

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

我在想一个可能的解决方案是将 while 循环放到一个单独的线程中,但我不确定。欢迎任何建议! :-)

【问题讨论】:

    标签: java android sockets tcp


    【解决方案1】:

    当应用程序正确访问服务器时,MainActivity.changeT(temp); 正在尝试从后台线程访问 UI 线程,这是不合适的。

    我通过将 MainActivity 的一个实例传递给这个 Client 类解决了这个问题,我使用了 runnable 方法 runOnUiThread(...)

    public class Client extends AsyncTask<Void, Void, Void> {
    
        int port;
        Socket s;
        MainActivity instance;
    
        Client(MainActivity instance)
        {
            this.instance = instance;
        }
    
        @Override
        protected Void doInBackground(Void... voids) {
            try {
                port = 1818;
                s = new Socket("xx.xx.xx.xx", port);
                if (!s.isConnected()) {
                    s.close();
                    return null;
                }
    
                BufferedReader re = new BufferedReader(new InputStreamReader(s.getInputStream()));
                String temp = null;
                TextView t = instance.getT(); // Accesses a getter method that returns the TextView.
    
                while ((temp = re.readLine()) != null)
                {
                    setText(t, temp); // Accesses the UI Thread and changes the TextView.
                }
    
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
            return null;
        }
    
        private void setText(final TextView text,final String value){
            instance.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    text.setText(value); // This is equivalent to writing the code in the UI thread itself.
                }
            });
        }
    

    【讨论】:

      猜你喜欢
      • 2017-11-03
      • 2012-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-30
      • 2013-06-03
      相关资源
      最近更新 更多