2012-06-07 66 views
1

我有以下奇怪的問題。無法使用asmack.jar啓動活動

我的主要活動如下:

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活動代碼:當我調用函數從asmack.jar LIB

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(); 
    } 


} 
} 

出現問題。例如,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

回答

0

建立遠程連接可以 需要很長時間。 您正嘗試直接從活動建立連接,默認情況下,此活動綁定到UI線程。

因此,只要您的活動嘗試建立連接,用戶界面就會被阻止。用戶不能按任何按鈕並且屏幕凍結。

通過拋出一個NetworkOnMainThreadException android操作系統迫使你改變你的實現,並迫使你從另一個線程建立連接。

總而言之,您不應該嘗試從UI線程建立遠程連接。嘗試從IntentServiceService建立它。 如果您確實想從活動中建立它,請嘗試使用AsyncTaskHandlerThread

編輯:看看Android的StrictMode

StrictMode最常用來捕捉偶然的磁盤或網絡應用程序的主線程,在UI操作 接收動畫需要 訪問上地點。

它可能爲您的應用程序啓用。

+0

我的代碼也有一個磁盤寫入違規:P 可能是asmack寫入磁盤 – Jochem

+0

這是可能的。 :)你是如何選擇最終解決問題的? –

+0

將strictmode代碼添加到我的onCreate()並觀看LogCat。 非常有用。 但我仍然需要爲連接製作一個額外的線程。 Android 4是否迫使開發人員以這種方式實現? – Jochem

0

//你需要在XMPPClient這個活動添加你的清單文件

,並添加網絡權限

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

//需要提到這樣的不像("jabber.org")

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

我把它們放在我的清單中: – Jochem

0

主線程中不允許IO。你需要創建一個AsyncTask並在那裏運行你的連接代碼。