2012-05-10 31 views
1

私のアプリは正常に動作しますが、アプリがバックグラウンドになると、再開する際にクラッシュします。 ソースコードでわかるように、私はonStart、onStopなどのイベントを記録します。起動できません再開時にComponentInfoアクティビティ

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

アプリを再起動しようとするとすぐにクラッシュします。それ以外のメッセージはログに記録されません。「アクティビティ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(); 
     } 
    } 
} 

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

5月12日08:40:21.743:D/AndroidRuntime(491):>>>>>>>>>>>>>> AndroidRuntime START < < < < < < < < < < < < < < 5月12日08:40:21.743: D/AndroidRuntime(491):40:CheckJNIは

05から12 08 ONである22.065:D/AndroidRuntime(491):---ネイティブ登録 機能---

5月12日08:40:23.353:D/AndroidRuntime(491):40:23.363:D/dalvikvm(491):VM

05から12 08をシャットダウンデバッガを取り外しました。 40:23.393:オブジェクト レジストリは1つのエントリ

5月12日08

を持っていたI/AndroidRuntime(491):注:スレッド の添付 'バインダースレッド#3'

5月12日午前8時40分に失敗しました: 24.184:D/AndroidRuntime(499):>>>>>>>>>>>>>> AndroidRuntime START < < < < < < < < < < < < < <

5月12日08:40:24.184:D/AndroidRuntime(499):40:CheckJNIは

05から12 08 ONである24.523:D/AndroidRuntime(499):--- ---ネイティブ 機能を登録します

5月12日08:40:25.873:I/ActivityManager(70):最低活性:テント{ 行為= android.intent.action.MAIN猫= [android.intent.category.LAUNCHER] FLG = 0x10000000 cmp = nl.yeswecanclinics.chat/.Start}

05-12 08:40:25。965:D/AndroidRuntime(499):VMをシャットダウンする

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

5月12日08

を持っていたI/AndroidRuntime(499):注:スレッド の添付 'バインダースレッド#3'

5月12日午前8時40分に失敗しました: 26.105:I/ActivityManager(70):活性についてnl.yeswecanclinics.chat/.Start PROC nl.yeswecanclinics.chatを開始します。 PID = 506 UID = 10032のGIDの= {3003、1015}

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

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

5月12日08:40:28.294:/ System.errの(506)W: java.security.KeyStoreException:40:キーストアJKS実装は

5月12日08が見つかりません28.294:W /システム.ERR(506):40:28.294:をSystem.err/W(506): org.jivesoftwareでjava.security.KeyStore.getInstance(KeyStore.java:134)

5月12日08時。 smack.ServerTrustManager。(ServerTrustManager.java:61)

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

5月12日08:40:28.304: org.jivesoftware.smack.PacketReader.parsePacketsで(PacketReader.java:268)をSystem.err(506)/ W

5月12日08:40:28.304:

05から12 08 でorg.jivesoftware.smack.PacketReader.access $ 000(PacketReader.java:44)をSystem.err(506)/ W: 40:28.313:W/System.err(506): org.jivesoftware.smack.PacketReader $ 1.run(PacketReader.java:71)

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

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

5月12日08:40:29.483:D/dalvikvmは、(506):40:29.663:GC_FOR_MALLOCは153ms

5月12日08に3668個のオブジェクト /280752バイトを解放I/CONN(506)。 40::I/CONN(506):29.685 RUNNING

5月12日08:40:29.685:I/CONN(506):onResume

5月12日

5月12日08 ONSTART 08:40:29693:I/CONN(506):RUNNING

5月12日08:40:30.633:I/ActivityManager(70):表示アクティビティ nl.yeswecanclinics.chat/.Start:4712ミリ秒(総384269 MS)

5月12日08:40:37.114:D/dalvikvm(175):41:GC_EXPLICIT私はBACKボタンを押し

05から12 08 444個のオブジェクト/ 122ms

で 22064バイトを解放07.253 :W/KeyCharacterMap(506):ID 0のキーボードなし

0 5-12 08:41:07.253:KeyCharacterMap/W(506):デフォルトのキーマップの使用:

/system/usr/keychars/qwerty.kcm.bin

5月12日08:41:07.403:I/CONN( 506):41:07.403:

5月12日08 onPause I/CONN(506):41:07.784:

5月12日08 STOP/InputManagerService(70)W:非 に入力を開始-focusedクライアント [email protected](UID = 10032 PID = 506)

5月12日08:41:07.804:W/IInputConnect ionWrapper(506): 非アクティブInputConnection上showStatusIcon

5月12日08:41:08.173:I/CONN(506):onStop

5月12日08:41:08.173:I/CONN(506) :41:30.583:

onDestroy IはICON

05から12 08をクリックすることによりAPPを再起動する(506)I /グローバル: BufferedReaderのコンストラクタで使用されるデフォルトバッファサイズ。 8k-charバッファが必要な場合は明示的に指定する方がよいでしょう。

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

5月12日08:41:31.663:/ System.errの(506)W: java.security.KeyStoreException:41:キーストアJKS実装は

5月12日08が見つかりません31.663:W /システム.ERR(506):41:31.663:をSystem.err/W(506): org.jivesoftwareでjava.security.KeyStore.getInstance(KeyStore.java:134)

5月12日08時。 smack.ServerTrustManager。(ServerTrustManager.java:61)

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

5月12日08:41:31.674: org.jivesoftware.smack.PacketReader.parsePacketsで(PacketReader.java:268)をSystem.err(506)/ W

5月12日08:41:31.683:

05から12 08 でorg.jivesoftware.smack.PacketReader.access $ 000(PacketReader.java:44)をSystem.err(506)/ W: 41:31。683:W/System.errの(506):で org.jivesoftware.smack.PacketReader $ 1.run(PacketReader.java:71)

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

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

5月12日08:41:32.043:D/AndroidRuntime(506):41:32.043:VM

05から12 08のシャットダウン/ dalvikvm(506)W:= 1スレッドID:スレッドで終了 キャッチされない例外(グループ= 0x4001d800)

5月12日08:41:32.214:D/dalvikvm(506):41:32.226 GC_FOR_MALLOCは147ms

05から12 08 5507オブジェクト /388504バイトを解放: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が

5月12日08:41:32.234:E/AndroidRuntime(506): android.appで.ActivityThread.performLaunchActivity(ActivityThread.java:2663)

5月12日08:41:32.234:E/AndroidRuntime(506):android.app.ActivityThread.handleLaunchActivi でTY(ActivityThread.java:2679)

5月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):41:32.234: android.app.ActivityThread $ H.handleMessage(ActivityThread.java:2033)

5月12日08時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)

5月12日08:41:32.234:E/AndroidRuntime(506): android.app.ActivityThread.mainで(ActivityThread.java:4627 )

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

5月12日08時/ AndroidRuntime(506): java.lang.reflect.Method.invoke(Method.java:521)で

5月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):41:32.234:E/AndroidRuntime(506):で com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)

5月12日08時 dalvik.system.NativeStart.main(ネイティブメソッド)

5月12日08:41:32.234:E/AndroidRuntime(506): java.lang.NullPointerExceptionが

5月12日08:起因します。 41:32.234:E/AndroidRuntime(506): org.jivesoftware.smackx.muc.MultiUserChat $ 1.connectionCreated(MultiUserChat.java:114)

5月12日08:41:32.234:E/AndroidRuntime(506): org.jivesoftware.smack.XMPPConnection.initConnection(XMPPConnection.java:618)

5月12日08時:41:32.234:E/AndroidRuntime(506): org.jivesoftware.smack.XMPPConnection.connectUsingConfigurationで(XMPPConnection.java:565)

5月12日08:41:32.234:E/AndroidRuntime(506): org.jivesoftware.smackで.XMPPConnection.connect(XMPPConnection.java:991)

5月12日08:41:32.234:E/AndroidRuntime(506): nl.yeswecanclinics.chat.Start.initConnection(Start.java:131)で

5月12日08:41:32.234:E/AndroidRuntime(506): nl.yeswecanclinics.chat.Start.onCreate(Start.java:71)で

5月12日08:41:32.234 :E/AndroidRuntime(506):41:32.234:E/AndroidRuntime(506): android.appでandroid.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)

5月12日08時。 ActivityThread.performLaunchActivity(ActivityThread.java:2627)

05-12 08:41:32.234:E/AndroidRuntime(506):... 11さらにあなたがif(connection.isConnected())をチェックしますかしようとすると、あなたがそれを設定しているためので、あなたがnullを受け取るnullconnection

+0

logcat出力を投稿できますか? –

+0

投稿するにはどうすればいいですか:-) – user1273768

+0

「ウィンドウ - >表示の表示 - >その他のビュー」を開き、「ログカット」を見つけてクリックします。次に、 'NullPointerException'を取得し、関連するlogcat出力(' NullPointerException'がどの行に出現したかを示すもの)を投稿するまで、プログラムを実行します。 'NullPointerException'が発生した行(正確な行番号がわからないので)も教えてください。 –

答えて

0

あなたはstopConnection方法で設定しました。 connectionnullでない場合はstartConnectionメソッドをチェックしてください。そうでない場合は、initConnectionメソッドに電話する必要があります。

+0

** bold **ではなくインラインコードに目盛り(shift +〜)を使用したい場合があります。 –

+0

'if(connection == null){'で変更しましたが、違いはありません。私のログでは、onResumeやonRestartのようなものは見えないので、アプリケーションはそのイベントに決して到達しません。 – user1273768

1

Marekの答えは確かに間違っていませんが(これは実際にはNullPointerExceptionになります)、私が知っていることは、UIスレッドで接続を試みるべきではないということです。接続を確立するのに数秒以上かかる場合は、必然的にアプリケーションがクラッシュすることになります。 AsnycTaskを作成し、接続とステータスの変更を行う必要があります。

+0

OK。私はそれを変更します。しかし、私はまだonResumeまたはonRestartイベントが決して到達しない理由を理解していません。初めてアプリを起動すると、ログ内のイベントしか表示されません。私は問題を解決するために、 'System.exit(0)'をstopConnection()に入れて、 – user1273768

関連する問題