1

私のアプリは正常に動作しますが、アプリがバックグラウンドに移行すると、再開する必要があるときにクラッシュします。ソースコードでわかるように、onStart、onStopなどのイベントをログに記録します。

私のログには、アプリを起動したときにonStart、onResumeが表示されます。バックキーを押すと、onStop、STOP、onPause、onDestroyが表示されます。

アプリを再起動しようとすると、すぐにクラッシュします。'Activity ComponentInfo java lang.NullPointerExceptionを開始できない場合を除いて、ログにそれ以上のメッセージはありません。

どうすればこれを防ぐことができますか?

public class Start extends Activity {

private Handler handler = new Handler();
private ArrayList<String> discussionThread;
private EditText textMessage;

private ListView listview;

private ConnectionConfiguration config;
private Presence presence;
private MultiUserChat muc;
private DiscussionHistory history;
private PacketFilter filter;
private MyCustomAdapter discussionThreadAdapter;
private XMPPConnection connection;


/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    try {
        initConnection();
    } catch (XMPPException e) {
        e.printStackTrace();
    }

    final EditText textMessage = (EditText) this.findViewById(R.id.message);        
    listview = (ListView) this.findViewById(R.id.list);

    discussionThread = new ArrayList<String>();
    discussionThreadAdapter = new MyCustomAdapter();
    listview.setAdapter(discussionThreadAdapter);

    Button send = (Button) this.findViewById(R.id.send);
    send.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            String text = textMessage.getText().toString();

            Message msg = new Message(ROOM, Message.Type.groupchat);
            msg.setBody(text);
            connection.sendPacket(msg);
            discussionThreadAdapter.notifyDataSetChanged();
            textMessage.setText("");
        }
    });


    textMessage.setOnKeyListener(new OnKeyListener()
    {
        public boolean onKey(View v, int keyCode, KeyEvent event)
        {
            if (event.getAction() == KeyEvent.ACTION_DOWN)
            {
                switch (keyCode)
                {
                    case KeyEvent.KEYCODE_DPAD_CENTER:
                    case KeyEvent.KEYCODE_ENTER:
                        SendText();
                        return true;
                    default:
                        break;
                }
            }
            return false;
        }
    });
}


private void initConnection() throws XMPPException {
    config = new ConnectionConfiguration(SERVER_HOST, SERVER_PORT, SERVICE_NAME);
    connection = new XMPPConnection(config);
    connection.connect();
    connection.login(LOGIN, PASSWORD);
    presence = new Presence(Presence.Type.available);

    connection.sendPacket(presence);

    muc = new MultiUserChat(connection, ROOM);
    history = new DiscussionHistory();

    history.setMaxStanzas(25);

    muc.join(LOGIN, PASSWORD, history, SmackConfiguration.getPacketReplyTimeout());

    filter = new MessageTypeFilter(Message.Type.groupchat);

    connection.addPacketListener(new PacketListener() {

        public void processPacket(Packet packet) {
            Message message = (Message) packet;
            if (message.getBody() != null) {
                String fromName = message.getFrom().substring(48);
                String nieuweRegel = fromName + ": " + message.getBody();

                fromName = fromName.toUpperCase();

                if (fromName.equals(LOGIN.toUpperCase())) {
                    discussionThreadAdapter.addVanMijItem(nieuweRegel);
                } else {
                    discussionThreadAdapter.addVanAnderItem(nieuweRegel);
                }

            }
        }
    }, filter);

}

private void Notify() {
    discussionThreadAdapter.notifyDataSetChanged();
    listview.setSelection(discussionThreadAdapter.getCount());
}

private class MyCustomAdapter extends BaseAdapter {

    private static final int BERICHT_VAN_ANDER = 0;
    private static final int BERICHT_VAN_MIJ = 1;
    private static final int TYPE_MAX_COUNT = BERICHT_VAN_MIJ + 1;

    private LayoutInflater mInflater;

    private TreeSet<Integer> mySet = new TreeSet<Integer>();

    public MyCustomAdapter() {
        mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    public void addVanAnderItem(final String item) {
        discussionThread.add(item);
        handler.post(new Runnable() {
            public void run() {
                Notify();
            }
        });

    }

    public void addVanMijItem(final String item) {
        discussionThread.add(item);
        mySet.add(discussionThread.size() - 1);
        handler.post(new Runnable() {
            public void run() {
                Notify();
            }
        });
    }

    @Override
    public int getItemViewType(int position) {
        return mySet.contains(position) ? BERICHT_VAN_MIJ : BERICHT_VAN_ANDER;
    }

    @Override
    public int getViewTypeCount() {
        return TYPE_MAX_COUNT;
    }

    @Override
    public int getCount() {
        return discussionThread.size();
    }

    @Override
    public String getItem(int position) {
        return discussionThread.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        int type = getItemViewType(position);
        if (convertView == null) {
            holder = new ViewHolder();
            switch (type) {
                case BERICHT_VAN_ANDER:
                    convertView = mInflater.inflate(R.layout.bericht_van_ander_item, null);
                    holder.textView = (TextView)convertView.findViewById(R.id.textline);
                    break;
                case BERICHT_VAN_MIJ:
                    convertView = mInflater.inflate(R.layout.bericht_van_mij_item, null);
                    holder.textView = (TextView)convertView.findViewById(R.id.textline);
                    break;
            }
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder)convertView.getTag();
        }
        holder.textView.setText(discussionThread.get(position));
        return convertView;
    }

}

public static class ViewHolder {
    public TextView textView;
}

private void SendText() {

    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(textMessage.getWindowToken(), 0);

    String text = textMessage.getText().toString();

    Message msg = new Message(ROOM, Message.Type.groupchat);
    msg.setBody(text);
    connection.sendPacket(msg);
    textMessage.setText("");
}

public void onStart() {
    super.onStart();
    Log.i("CONN", "onStart");
    startConnection();
}

public void onRestart() {
    super.onRestart();
    Log.i("CONN", "onReStart");
    startConnection();
}

public void onResume() {
    super.onResume();
    Log.i("CONN", "onResume");
    startConnection();
}

public void onPause() {
    super.onPause();
    Log.i("CONN", "onPause");
    stopConnection();

}

public void onStop() {
    super.onStop();
    Log.i("CONN", "onStop");
    stopConnection();
}

public void onDestroy() {
    super.onDestroy();
    Log.i("CONN", "onDestroy");
    stopConnection();
}

private void stopConnection() {

    if (connection != null) {

        Log.i("CONN", "STOP");

        connection.disconnect(presence);

        connection = null;
        filter = null;
        history = null;
        muc = null;
        presence = null;
        config = null;
        discussionThreadAdapter = null;


    }

}

private void startConnection() {

    if (connection.isConnected() ) {

    } else {

        Log.i("CONN", "START");

        try {
            initConnection();
        } catch (XMPPException e) {
            e.printStackTrace();
        }
    }
}

}

OK私は以下を変更しました:

   private void startConnection() {

    if (connection != null ) {

        Log.i("CONN", "RUNNING");

    } else {

        Log.i("CONN", "START");

        try {
            initConnection();
        } catch (XMPPException e) {
            e.printStackTrace();
        }
    }
}

アプリを起動すると、すべて正常に動作します。ログ:

05-12 08:40:21.743:D / AndroidRuntime(491):>>>>>>>>>>>>>> AndroidRuntime START <<<<<<<<<<<<<< 05-12 08 :40:21.743:D / AndroidRuntime(491):CheckJNIがオンになっています

05-12 08:40:22.065:D / AndroidRuntime(491):---ネイティブ関数の登録---

05-12 08:40:23.353:D / AndroidRuntime(491):VMをシャットダウンしています

05-12 08:40:23.363:D / dalvikvm(491):デバッガーがデタッチされました。オブジェクトレジストリには1つのエントリがありました

05-12 08:40:23.393:I / AndroidRuntime(491):注:スレッド「バインダースレッド#3」の接続に失敗しました

05-12 08:40:24.184:D / AndroidRuntime(499):>>>>>>>>>>>>>> AndroidRuntime START <<<<<<<<<<<<<<

05-12 08:40:24.184:D / AndroidRuntime(499):CheckJNIがオンになっています

05-12 08:40:24.523:D / AndroidRuntime(499):---ネイティブ関数の登録---

05-12 08:40:25.873:I / ActivityManager(70):アクティビティの開始:インテント{act = android.intent.action.MAIN cat = [android.intent.category.LAUNCHER] flg = 0x10000000 cmp=nl.yeswecanclinics。チャット/.Start}

05-12 08:40:25.965:D / AndroidRuntime(499):VMをシャットダウンしています

05-12 08:40:25.973:D / dalvikvm(499):デバッガーがデタッチされました。オブジェクトレジストリには1つのエントリがありました

05-12 08:40:26.034:I / AndroidRuntime(499):注:スレッド「バインダースレッド#3」の接続に失敗しました

05-12 08:40:26.105:I / ActivityManager(70):アクティビティnl.yeswecanclinics.chat/のproc nl.yeswecanclinics.chatを開始します。開始:pid = 506 uid = 10032 gids = {3003、1015}

05-12 08:40:27.843:I / global(506):BufferedReaderコンストラクターで使用されるデフォルトのバッファーサイズ。8k文字のバッファが必要な場合は、明示的にする方がよいでしょう。

05-12 08:40:27.843:I / global(506):BufferedWriterコンストラクターで使用されるデフォルトのバッファーサイズ。8k文字のバッファが必要な場合は、明示的にする方がよいでしょう。

05-12 08:40:28.294:W / System.err(506):java.security.KeyStoreException:KeyStorejks実装が見つかりません

05-12 08:40:28.294:W / System.err(506):java.security.KeyStore.getInstance(KeyStore.java:134)で

05-12 08:40:28.294:W / System.err(506):org.jivesoftware.smack.ServerTrustManager。(ServerTrustManager.java:61)

05-12 08:40:28.294:W / System.err(506):org.jivesoftware.smack.XMPPConnection.proceedTLSReceived(XMPPConnection.java:832)

05-12 08:40:28.304:W / System.err(506):org.jivesoftware.smack.PacketReader.parsePackets(PacketReader.java:268)

05-12 08:40:28.304:W / System.err(506):org.jivesoftware.smack.PacketReader.access $ 000(PacketReader.java:44)

05-12 08:40:28.313:W / System.err(506):org.jivesoftware.smack.PacketReader $ 1.run(PacketReader.java:71)

05-12 08:40:29.004:I / global(506):BufferedReaderコンストラクターで使用されるデフォルトのバッファーサイズ。8k文字のバッファが必要な場合は、明示的にする方がよいでしょう。

05-12 08:40:29.014:I / global(506):BufferedWriterコンストラクターで使用されるデフォルトのバッファーサイズ。8k文字のバッファが必要な場合は、明示的にする方がよいでしょう。

05-12 08:40:29.483:D / dalvikvm(506):GC_FOR_MALLOCは、153ミリ秒で3668オブジェクト/280752バイトを解放しました

05-12 08:40:29.663:I / CONN(506):onStart

05-12 08:40:29.685:I / CONN(506):実行中

05-12 08:40:29.685:I / CONN(506):onResume

05-12 08:40:29.693:I / CONN(506):実行中

05-12 08:40:30.633:I / ActivityManager(70):表示されたアクティビティnl.yeswecanclinics.chat/.Start:4712ミリ秒(合計384269ミリ秒)

05-12 08:40:37.114:D / dalvikvm(175):GC_EXPLICITは、122ミリ秒で444オブジェクト/22064バイトを解放しました

バックボタンを押す

05-12 08:41:07.253:W / KeyCharacterMap(506):ID0のキーボードがありません

05-12 08:41:07.253:W / KeyCharacterMap(506):デフォルトのキーマップを使用:/system/usr/keychars/qwerty.kcm.bin

05-12 08:41:07.403:I / CONN(506):onPause

05-12 08:41:07.403:I / CONN(506):停止

05-12 08:41:07.784:W / InputManagerService(70):フォーカスされていないクライアントで入力を開始しますcom.android.internal.view.IInputMethodClient $ Stub $ Proxy @ 45066cf8(uid = 10032 pid = 506)

05-12 08:41:07.804:W / IInputConnectionWrapper(506):非アクティブなInputConnectionのshowStatusIcon

05-12 08:41:08.173:I / CONN(506):onStop

05-12 08:41:08.173:I / CONN(506):onDestroy

アイコンをクリックしてアプリを再起動します

05-12 08:41:30.583:I / global(506):BufferedReaderコンストラクターで使用されるデフォルトのバッファーサイズ。8k文字のバッファが必要な場合は、明示的にする方がよいでしょう。

05-12 08:41:30.623:I / global(506):BufferedWriterコンストラクターで使用されるデフォルトのバッファーサイズ。8k文字のバッファが必要な場合は、明示的にする方がよいでしょう。

05-12 08:41:31.663:W / System.err(506):java.security.KeyStoreException:KeyStorejks実装が見つかりません

05-12 08:41:31.663:W / System.err(506):java.security.KeyStore.getInstance(KeyStore.java:134)で

05-12 08:41:31.663:W / System.err(506):org.jivesoftware.smack.ServerTrustManager。(ServerTrustManager.java:61)

05-12 08:41:31.674:W / System.err(506):org.jivesoftware.smack.XMPPConnection.proceedTLSReceived(XMPPConnection.java:832)

05-12 08:41:31.674:W / System.err(506):org.jivesoftware.smack.PacketReader.parsePackets(PacketReader.java:268)

05-12 08:41:31.683:W / System.err(506):org.jivesoftware.smack.PacketReader.access $ 000(PacketReader.java:44)

05-12 08:41:31.683:W / System.err(506):org.jivesoftware.smack.PacketReader $ 1.run(PacketReader.java:71)

05-12 08:41:31.984:I / global(506):BufferedReaderコンストラクターで使用されるデフォルトのバッファーサイズ。8k文字のバッファが必要な場合は、明示的にする方がよいでしょう。

05-12 08:41:31.994:I / global(506):BufferedWriterコンストラクターで使用されるデフォルトのバッファーサイズ。8k文字のバッファが必要な場合は、明示的にする方がよいでしょう。

05-12 08:41:32.043:D / AndroidRuntime(506):VMをシャットダウンしています

05-12 08:41:32.043:W / dalvikvm(506):threadid = 1:キャッチされない例外でスレッドが終了します(group = 0x4001d800)

05-12 08:41:32.214:D / dalvikvm(506):GC_FOR_MALLOCは、147ミリ秒で5507オブジェクト/388504バイトを解放しました

05-12 08:41:32.226:D / NativeCrypto(506):OpenSSLセッションを解放します

05-12 08:41:32.234:E / AndroidRuntime(506):致命的な例外:メイン

05-12 08:41:32.234:E / AndroidRuntime(506):java.lang.RuntimeException:アクティビティを開始できませんComponentInfo {nl.yeswecanclinics.chat/nl.yeswecanclinics.chat.Start}:java.lang.NullPointerException

05-12 08:41:32.234:E / AndroidRuntime(506):android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)

05-12 08:41:32.234:E / AndroidRuntime(506):android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)

05-12 08:41:32.234:E / AndroidRuntime(506):android.app.ActivityThread.access $ 2300(ActivityThread.java:125)

05-12 08:41:32.234:E / AndroidRuntime(506):android.app.ActivityThread $ H.handleMessage(ActivityThread.java:2033)

05-12 08:41:32.234:E / AndroidRuntime(506):android.os.Handler.dispatchMessage(Handler.java:99)

05-12 08:41:32.234:E / AndroidRuntime(506):android.os.Looper.loop(Looper.java:123)

05-12 08:41:32.234:E / AndroidRuntime(506):android.app.ActivityThread.main(ActivityThread.java:4627)

05-12 08:41:32.234:E / AndroidRuntime(506):java.lang.reflect.Method.invokeNative(ネイティブメソッド)

05-12 08:41:32.234:E / AndroidRuntime(506):java.lang.reflect.Method.invoke(Method.java:521)で

05-12 08:41:32.234:E / AndroidRuntime(506):com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:868)05-12 08:41:32.234:E / AndroidRuntime( 506):com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)

05-12 08:41:32.234:E / AndroidRuntime(506):dalvik.system.NativeStart.main(ネイティブメソッド)

05-12 08:41:32.234:E / AndroidRuntime(506):原因:java.lang.NullPointerException

05-12 08:41:32.234:E / AndroidRuntime(506):org.jivesoftware.smackx.muc.MultiUserChat $ 1.connectionCreated(MultiUserChat.java:114)

05-12 08:41:32.234:E / AndroidRuntime(506):org.jivesoftware.smack.XMPPConnection.initConnection(XMPPConnection.java:618)

05-12 08:41:32.234:E / AndroidRuntime(506):org.jivesoftware.smack.XMPPConnection.connectUsingConfiguration(XMPPConnection.java:565)

05-12 08:41:32.234:E / AndroidRuntime(506):org.jivesoftware.smack.XMPPConnection.connect(XMPPConnection.java:991)

05-12 08:41:32.234:E / AndroidRuntime(506):at nl.yeswecanclinics.chat.Start.initConnection(Start.java:131)

05-12 08:41:32.234:E / AndroidRuntime(506):at nl.yeswecanclinics.chat.Start.onCreate(Start.java:71)

05-12 08:41:32.234:E / AndroidRuntime(506):android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)

05-12 08:41:32.234:E / AndroidRuntime(506):android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)

05-12 08:41:32.234:E / AndroidRuntime(506):...11詳細

4

2 に答える 2

1

Marek の答えは確かに間違っていませんが (これが実際に を取得している理由かもしれませんNullPointerException)、私が知っていることの 1 つは、UI スレッドで接続を試みてはならないということです。これにより、接続に数秒以上かかる場合、必然的にアプリケーションがクラッシュします。AsnycTaskそこで接続とステータスの変更を行ってください。

于 2012-05-10T08:29:26.513 に答える
0

stopConnectionメソッドnullにそう設定してconnectionあるのでチェックしようとするif(connection.isConnected())と受信nullします。そうでない場合は、startConnectionメソッドをチェックインする必要があります。それ以外の場合は、メソッドを呼び出す必要があります。connectionnullinitConnection

于 2012-05-10T08:20:26.513 に答える