Socket.isConnected()使我的Android应用程序强制关闭

时间:2015-01-25 21:26:58

标签: android sockets

当我使用方法

时,我不知道我的源代码在Android中的Socket会发生什么
  

.isConnected()

我的应用总是强行关闭。这是我的源代码

public class MyActivity extends Activity {
    private String IP;
    private int PORT;
    private Socket socket;
    private PrintWriter printWriter;
    private TextView text;

    private EditText fieldIp;
    private EditText fieldPort;


    private Button connect;
    private FrameLayout frameIP;

    private String message;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);

        frameIP = (FrameLayout)findViewById(R.id.frameIP);
        connect = (Button)findViewById(R.id.connect);
        fieldIp = (EditText)findViewById(R.id.ip);
        fieldPort = (EditText)findViewById(R.id.port);
        text = (TextView)findViewById(R.id.keterangan);
        connect.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                IP = fieldIp.getText().toString();
                PORT = Integer.parseInt(fieldPort.getText().toString());
                SocketConnect socketConnect = new SocketConnect(IP,PORT);
                socketConnect.execute();
            }
        });
    }


    private class SocketConnect extends AsyncTask<Void, Void, Boolean> {

        String ip;
        int port;

        public SocketConnect(String a, int b){
            this.ip = a;
            this.port = b;
        }


        @Override
        protected Boolean doInBackground(Void... params) {
            try {
                socket = new Socket();
                socket.connect(new InetSocketAddress(ip,port));
                if(socket.isConnected())
                {
                    text.setText("Connected!");
                }
                else
                {
                    text.setText("Failed to connect!");
                }
            } catch (IOException e) {
                Log.e("MyActivity",e.getMessage());
            }
            finally {
                startActivity(new Intent(getApplicationContext(),ListViewText.class));
            }
            return null;
        }
    }
}

我在AndroidManifest.xml中使用它

<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>

我希望你能帮助我们:(

2 个答案:

答案 0 :(得分:1)

按如下方式更改doInBackground方法...

@Override
protected Boolean doInBackground(Void... params) {

    boolean success = true;

    try {
        socket = new Socket();
        socket.connect(new InetSocketAddress(ip, port));
    } catch (Exception e) {
        success = false;
        Log.e("MyActivity", e.getMessage());
    }
    return success;
}

然后添加onPostExecute方法......

@Override
protected void onPostExecute(boolean result) {
    if(result) {
        text.setText("Connected!");
        startActivity(new Intent(MyActivity.this, ListViewText.class));
    }
    else {
        text.setText("Failed to connect!");
    }
}

答案 1 :(得分:1)

首先要在UI线程之外调用UI操作(这就是创建AsyncTask的原因,仅在doInBackground中处理后台作业)所以关于显示文本的问题解决了TextView的问题......

但更重要的是:

永远不要在AsyncTask中打开Socket。在Android developer site上,您可以找到以下内容:

  

如果你需要保持线程长时间运行,那就是   强烈建议您使用提供的各种API   java.util.concurrent包,如Executor,ThreadPoolExecutor和   FutureTask。)

这正是你想要做的。因此,请使用ServiceThread或上面提到的那些。

相关问题