【问题标题】:Android client force-closingAndroid客户端强制关闭
【发布时间】:2012-06-18 12:12:58
【问题描述】:

我是 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

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

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

【问题讨论】:

  • AndroidManifest.xml 是否添加了 INTERNET 权限?
  • 添加logcat。没有它,我们无能为力。
  • 是的,我添加了
  • 对不起,我说我是 android 新手如何获取 logcat?

标签: android tcp


【解决方案1】:

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


编辑:

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

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

例如,如果您触摸屏幕上的按钮,UI 线程 将触摸事件分派给小部件,小部件反过来设置它的 按下状态并向事件队列发布无效请求。这 UI 线程将请求出列并通知小部件重绘 自己。

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

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

【讨论】:

  • 当然,这是假设您正在为 ICS 编写应用程序。如果没有,您仍应确保仅在单独的 Thread 上创建新的 Sockets。
  • 我刚刚看了你更新的帖子......问题是new Socket() 指令阻止了UI线程绘制屏幕布局......我们的两个答案的组合:)。一定要解决这个问题,这很重要!!
  • 你能解释一下我对android和java的新手我使用c++吗
  • 查看this 获取一些示例代码。
  • 我刚刚更新了我的答案......希望能为你澄清事情。我不熟悉 C++ 线程,所以我不能确定:)。
【解决方案2】:

如果将setContentView 移到try 语句上方会怎样?

【讨论】:

  • 谢谢我做了你的建议,它不再强制关闭,但我在 logat 中发现它说 tcptest 错误(我是如何编程的)。 Log.e("TcpTest","错误");有没有办法改变它以获得更多描述性错误?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-21
  • 2012-04-09
  • 1970-01-01
  • 2014-07-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多