0

为了简单地演示套接字编程在 Android 平台中的工作原理,我想开发一个没有线程/异步任务的简单套接字程序,并且(如果可能)没有异常捕获。那可能吗?我已经尝试过,但它不起作用(正如许多其他人指出的那样,套接字最好在其他线程上运行)。

 @Override
 public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    tv = (TextView) findViewById(R.id.TextView01);
    tv.setText("Nothing from client yet");

 }


 public Void handleOnClick(View v) {
     Socket s = null;
     try {
     ss = new ServerSocket(SERVERPORT);
     } catch (IOException e) {
     e.printStackTrace();
     }
     try {
     s = ss.accept();
     BufferedReader input = new BufferedReader(
         new InputStreamReader(s.getInputStream()));
     String st = null;
     st = input.readLine();
     mClientMsg = st;
     } catch (IOException e) {
     e.printStackTrace();
     }
 }
4

1 回答 1

0

你可以在不使用 AsyncTask 的情况下开发任何东西,但我绝对不推荐它,因为你的应用程序会阻塞直到任务完成(我相信你已经知道了)!在这种情况下,您的套接字需要足够快地响应,以便操作系统不会杀死您的进程(请参阅此处关于 ANR的讨论)。

您将不得不在某一时刻处理异常。您能做的最好的事情就是让您的方法抛出异常并在调用方法的任何地方处理它们,但这并不意味着您不必处理它们;这只会耽误他们。

public Void handleOnClick(View v) throws IOException {
    Socket s = null;
    ss = new ServerSocket(SERVERPORT);
    s = ss.accept();
    BufferedReader input = new BufferedReader(
            new InputStreamReader(s.getInputStream()));
    String st = null;
    st = input.readLine();
    mClientMsg = st;
}

如果这是为了给其他人做一个例子或示范,它应该结构良好,以便人们学会正确地做事。我强烈建议您考虑处理应该处理的异常(或在链上抛出更有意义的异常)。此外,如果你正在教一个班级或个人这些东西,你应该在某一时刻展示如何避免被 ANR 扇耳光。

于 2012-08-02T03:21:01.343 回答