无法使用asmack.jar启动活动

时间:2012-06-07 09:30:47

标签: java android eclipse

我有以下奇怪的问题。

我的主要活动如下:

public class CityGame extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Intent myIntent = new Intent(this, XMPPClient.class);
    startActivity(myIntent);

 }
}

我将代码条带化以查找问题。上面的代码不会再直接跳转到XMPPClient活动。 XMPPClient活动正在使用asmack.jar库,并且该库已添加到我的eclipse构建路径中。

XMPPClient活动代码:

public class XMPPClient extends Activity {

/**
 * Called with the activity is first created.
 */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    Log.i("XMPPClient", "onCreate called");

    //Create a connection to the jabber.org server.
    Connection conn1 = new XMPPConnection("jabber.org");
    try {
        conn1.connect();
    } catch (XMPPException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }


}
}

当我从asmack.jar lib调用函数时出现问题。例如,conn1.connect();一遍又一遍地崩溃了我的应用程序。我得到的错误如下:

06-07 09:05:03.085: E/AndroidRuntime(538): FATAL EXCEPTION: main
06-07 09:05:03.085: E/AndroidRuntime(538): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.joop.citygame/com.joop.citygame.XMPPClient}: android.os.NetworkOnMainThreadException
06-07 09:05:03.085: E/AndroidRuntime(538):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1955)
06-07 09:05:03.085: E/AndroidRuntime(538):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980)
06-07 09:05:03.085: E/AndroidRuntime(538):  at android.app.ActivityThread.access$600(ActivityThread.java:122)

清单文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.joop.citygame"
android:versionCode="1"
android:versionName="1.0" >

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

<uses-sdk android:minSdkVersion="14" />

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" >
    <activity
        android:label="@string/app_name" 
        android:name=".CityGame" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:label="@string/app_name"
        android:name=".XMPPClient" >
        <intent-filter>
            <action android:name="com.joop.citygame.XMPPClient" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>
</application>

</manifest>

任何人都知道我做错了什么?

信息:API级别14

3 个答案:

答案 0 :(得分:0)

//您需要在清单文件中添加XMPPClient此活动

并添加网络权限

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

//需要像这样提及("jabber.org")

Connection conn1 = new XMPPConnection("http://www.jabber.org");

答案 1 :(得分:0)

建立远程连接可能需要很长时间。 您正尝试直接从活动建立连接,默认情况下,此活动绑定到UI线程。

因此,只要您的活动尝试建立连接,就会阻止用户界面。用户无法按任何按钮,屏幕就会冻结。

通过抛出NetworkOnMainThreadException android操作系统迫使你改变你的实现,并迫使你从另一个线程建立你的连接。

总而言之,您不应尝试从UI线程建立远程连接。尝试从IntentServiceService建立它。 如果您确实想要通过活动建立活动,请尝试使用AsyncTaskHandlerThread

编辑:看看android StrictMode

  

StrictMode最常用于捕获意外磁盘或网络   访问应用程序的主线程,UI操作在哪里   接收和动画发生。

可能会为您的应用程序启用。

答案 2 :(得分:0)

主线程中不允许IO。您需要创建一个AsyncTask并在那里运行您的连接代码。