Android客户端强制关闭

时间:2012-04-07 18:54:44

标签: android tcp

我是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);
        }
     }
   }

编辑: manifest app force中设置的Internet权限在这里关闭是logcat。 http://i43.tinypic.com/25tc1o7.png

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

感谢迄今为止所有发布的答案。

2 个答案:

答案 0 :(得分:1)

您正在尝试在UI线程上建立连接,并且ICS正在崩溃您的应用程序(因为它应该,因为尝试连接到UI线程上的Web服务器几乎可以肯定是您的应用程序无法正常运行) 。确保使用AsyncTaskThread建立连接。


编辑:

你要求澄清一下,所以在这里。来自开发者网站上的Android article

  

启动应用程序时,系统会创建一个名为的线程   申请的“主要”。主线程,也称为UI   线程,非常重要,因为它负责调度   事件到适当的小部件,包括绘图事件。它是   也是应用程序与运行交互的线程   Android UI工具包的组件。

     

例如,如果您触摸屏幕上的a按钮,则会显示UI线程   将触摸事件调度到窗口小部件,窗口小部件又设置它   按下状态并向事件队列发布无效请求。该   UI线程将请求出列并通知窗口小部件重绘   本身。

     

这种单线程模型可能会导致性能不佳,除非你的   应用程序正确实施。具体来说,如果一切都是   发生在一个线程中,执行诸如的长操作   UI线程上的网络访问或数据库查询将阻止   整个用户界面。不能发送任何事件,包括绘图   事件,而长期运作正在进行中。来自用户的   透视,应用程序显示挂起。更糟糕的是,如果用户界面   线程被阻止超过几秒钟(约5秒钟)   目前,用户被提出臭名昭着的“应用程序没有   响应“(ANR)对话框。

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

答案 1 :(得分:0)

如果您将setContentView移到try声明之上,该怎么办?