【问题标题】:Android socket programingAndroid套接字编程
【发布时间】:2014-07-22 07:42:13
【问题描述】:

我正在尝试制作一个简单的 Android 应用程序,通过 WiFi 将字符串发送到微控制器,该微控制器稍后将用作打开和关闭 LED 的命令。

以下是我拥有的代码,我在理解它为什么不起作用时遇到了问题。 基本上抛出异常并引发“连接失败”吐司。

     String hostname = "192.168.50.1";
     int port = 5001;
     PrintWriter out = null;

     //access_point.connect(new InetSocketAddress(hostname, port));

    public void command() throws Exception {

        try{
             Socket access_point = new Socket(hostname,port);
            out = new PrintWriter(access_point.getOutputStream(), true);
            out.println("Turn on"); 
            Toast.makeText(getBaseContext(), "Connection successful", Toast.LENGTH_LONG).show();
        //  BufferedReader in = new BufferedReader(new InputStreamReader(access_point.getInputStream()));
        }
        catch(Exception e){

            Toast.makeText(getBaseContext(), "Connection failed", Toast.LENGTH_LONG).show();

        }



    }


     ToggleButton tbutton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_fullscreen);

        // code for toggle button 
        tbutton = (ToggleButton) findViewById(R.id.toggleButton1);
        tbutton.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                if(((ToggleButton)v).isChecked())
                {
                    try{
                        command();
                        Toast.makeText(getBaseContext(), "Communication ON string sent", Toast.LENGTH_SHORT).show();
                    }

                    catch(Exception e)
                    {
                        Toast.makeText(getBaseContext(), "Communication failed", Toast.LENGTH_LONG).show();
                    }


                }
                else
                {
                    Toast.makeText(getBaseContext(), "Communication OFF string sent", Toast.LENGTH_LONG).show();
                }       
              } 
            });
        }
}

【问题讨论】:

  • 记录您的异常以查看可能的NetworkOnMainThreadException

标签: java android sockets


【解决方案1】:

你应该使用

    Log.d(getClass().getSimpleName(), "Connection failed", exception);

您可能遇到的问题是您在主线程上运行网络连接,这可能会在超时时冻结应用程序,因此 Android 操作系统不允许这样做。

查看此问题以获取有关如何在不同线程上运行网络连接并解决您的问题的更多信息:Using AsyncTask for android network connection

【讨论】:

  • 非常感谢!我没有意识到这一点,因为这是我的第一个应用程序:P
  • 我很高兴我能帮上忙 :) 进入困难的部分,呵呵 - 如果您以前没有听说过,一个 Activity 在屏幕方向更改时被销毁并重新创建,这一点很重要。如果 AsyncTask 在需要更新 UI 的 Activity 中运行,但此后又被重新创建,这可能会弄乱 AsyncTask 的事情!为此,您可以在 Activity 中使用 Fragment,因为如果您在其上使用 setRetainInstance(true),Fragment 将保持活动状态。一个例子在这里:androidresearch.wordpress.com/2013/05/10/…
  • 当然,如果您真的不需要,最简单的解决方案是阻止屏幕方向更改。它会导致无数问题,并且几乎是 Android 编程中最难学习的事情之一。
  • 很高兴你这么告诉我。我最终会阻止屏幕方向的变化。无论如何,用户界面在横向上看起来更好:P
猜你喜欢
  • 2011-08-19
  • 1970-01-01
  • 2012-10-28
  • 2010-10-16
  • 1970-01-01
  • 2015-07-28
  • 2013-10-09
相关资源
最近更新 更多