0

我是 android 新手,想知道是否有人可以帮助我,这是我拥有的代码。

import java.io.*;
import java.net.*;
import android.app.*;
import android.util.Log;
import android.os.*;
import android.view.*;

public class MainActivity extends Activity
  {
  @Override
  public void onCreate(Bundle savedInstanceState)
    {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    try
      {
      Socket TestSocket = new Socket("96.29.64.93",2215);
      OutputStream writer = TestSocket.getOutputStream();
      writer.write(new byte[]{1});
      writer.flush();

      InputStream reader = TestSocket.getInputStream();
      byte array[] = new byte[1];
      int i = reader.read(array);
      }catch(IOException ex)
        {
        Log.e("TcpTest","Error",ex);
        }
     }
   }

编辑:在清单应用程序强制关闭此处设置的互联网权限是 logcat。 http://i43.tinypic.com/25tc1o7.png

如果我取消互联网权限,它不会强制关闭。

并感谢到目前为止所有已在此处发布的答案。

4

2 回答 2

1

您正在尝试在 UI 线程上建立连接,而 ICS 正在使您的应用程序崩溃(因为尝试在 UI 线程上连接到 Web 服务器几乎肯定会保证您的应用程序无法正常运行)。确保您使用AsyncTask或 进行连接Thread


编辑:

你要求澄清一下,所以就这样吧。来自开发者网站上的一篇 Android文章

启动应用程序时,系统会为该应用程序创建一个名为“main”的线程。主线程,也称为 UI 线程,非常重要,因为它负责将事件分派给适当的小部件,包括绘图事件。它也是您的应用程序与正在运行的 Android UI 工具包组件交互的线程。

例如,如果您触摸屏幕上的 a 按钮,UI 线程会将触摸事件分派给小部件,然后小部件设置其按下状态并将无效请求发送到事件队列。UI 线程将请求出列并通知小部件重绘自身。

除非您的应用程序正确实现,否则这种单线程模型可能会产生较差的性能。具体来说,如果一切都发生在单个线程中,在 UI 线程上执行网络访问或数据库查询等长时间操作将阻塞整个用户界面。长时间操作正在进行时,不能分派任何事件,包括绘图事件。从用户的角度来看,应用程序似乎挂起。更糟糕的是,如果 UI 线程被阻塞超过几秒(目前大约 5 秒),用户会看到臭名昭著的“应用程序无响应”(ANR)对话框。

这适用于您的情况,因为尝试在客户端和服务器之间建立套接字连接会阻塞UI 线程——在建立连接之前,用户根本无法与屏幕交互(这不会在 Android 市场中获得太多好评 :P)。因此,在单独的线程上执行潜在的昂贵/长期操作非常重要。最简单的方法是使用 an AsyncTask,它非常容易实现并且本质上抽象了Threads 的整个概念,因此您不必担心它。

于 2012-04-07T19:02:20.057 回答
0

如果你移动setContentView上面的try语句呢?

于 2012-04-07T19:00:05.597 回答