1

次の奇妙な問題があります。

私の主な活動は次のようになります。

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 ライブラリから関数を呼び出すと、問題が発生します。たとえば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

4

3 に答える 3

0

メインスレッドではIOは許可されていません。AsyncTaskを作成し、そこで接続コードを実行する必要があります。

于 2013-02-15T20:40:13.823 に答える
0

// XMPPClient でこのアクティビティをマニフェスト ファイルに追加する必要があります

ネットワーク権限を追加する

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

//このように言及する必要があります("jabber.org")

Connection conn1 = new XMPPConnection("http://www.jabber.org");
于 2012-06-07T09:46:13.823 に答える
0

リモート接続の確立には時間がかかる場合があります。アクティビティから直接接続を確立しようとしていますが、デフォルトでは、このアクティビティは UI スレッドにバインドされています。

その結果、アクティビティが接続を確立しようとしている限り、ユーザー インターフェイスはブロックされます。ユーザーはどのボタンも押すことができず、画面がフリーズします。

NetworkOnMainThreadExceptionをスローすることにより、Android オペレーティング システムは実装の変更を強制し、別のスレッドから接続を確立することを強制しています。

要約すると、UI スレッドからリモート接続を確立しようとしないでください。IntentServiceまたはServiceから確立してみてください。本当にアクティビティから確立したい場合は、AsyncTaskまたはHandlerThreadを使用してみてください。

編集:アンドロイドStrictModeを見てください:

StrictMode は、UI 操作が受信され、アニメーションが発生するアプリケーションのメイン スレッドで、偶発的なディスクまたはネットワーク アクセスを検出するために最もよく使用されます。

アプリケーションで有効になっている可能性があります。

于 2012-06-07T09:52:37.213 に答える