2012-05-10 134 views
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(); 
     } 
    } 
} 

我啓動應用程序,一切工作正常。日誌:

8月5日至12日:40:21.743:d/AndroidRuntime(491):>>>>>>>>>>>>>>>>>>> AndroidRuntime START < < < < < < < < < < < < < < 8月5日至12日:40:21.743: d/AndroidRuntime(491):CheckJNI是ON

8月5日至12日:40:22.065:d/AndroidRuntime(491):---註冊本地 功能---

八月5日至12日:40:23.353:d/AndroidRuntime(491):關閉VM

八月5日至12日: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 < < < < < < < < < < < < < <

八月5日至12日:40:24.184:d/AndroidRuntime(499):CheckJNI是ON

八月5日至12日:40:24.523:d/AndroidRuntime(499):---註冊本地 功能---

8月5日至12日:40:25.873:I/ActivityManager(70):啓動活動:意向{ ACT = 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):調試器已分離;對象 註冊表有1項

05-12 08:40:26.034:I/AndroidRuntime(499):注:連接螺紋 的 '粘合線#3' 失敗

05-12 08:40: 26.105:I/ActivityManager(70):開始PROC nl.yeswecanclinics.chat對於活性nl.yeswecanclinics.chat/.Start: PID = 506的uid = 10032的GID = {3003,1015}

8月5日至12日:40:27.843:I /全局(506):在 BufferedReader構造函數中使用的默認緩衝區大小。如果需要一個8k-char緩衝區,那麼最好是明確的。

05-12 08:40:27.843:I/global(506):在 BufferedWriter構造函數中使用的默認緩衝區大小。如果需要一個8k-char緩衝區,那麼最好是明確的。

8月5日至12日:40:28.294:W/System.err的(506): java.security.KeyStoreException:密鑰庫JKS實施找不到

8月5日至12日:40:28.294:W /系統.ERR(506):在 java.security.KeyStore.getInstance(KeyStore.java:134)

八月5日至12日:40:28.294:W/System.err的(506):在 org.jivesoftware。 (ServerTrustManager.java:61)

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

8月5日至12日:40:28.304:W/System.err的(506):在 org.jivesoftware.smack.PacketReader.parsePackets(PacketReader.java:268)

8月5日至12日:40:28.304:W/System.err的(506):在 org.jivesoftware.smack.PacketReader.access $ 000(PacketReader.java:44)

8月5日至12日: 40:28.313:W/System.err的(506):在 org.jivesoftware.smack.PacketReader $ 1.run(PacketReader.java:71)

八月5日至12日:40:29.004:I /水珠al(506):在 BufferedReader構造函數中使用的默認緩衝區大小。如果需要一個8k-char緩衝區,那麼最好是明確的。

05-12 08:40:29.014:I/global(506):在 BufferedWriter構造函數中使用的默認緩衝區大小。如果需要一個8k-char緩衝區,那麼最好是明確的。

8月5日至12日:40:29.483:d/dalvikvm(506):GC_FOR_MALLOC釋放在153ms的

8月5日至12日3668個對象 /280752字節: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 8時40分29秒。693:I/CONN(506):在運行

8月5日至一十二日:40:30.633:I/ActivityManager(70):顯示活動 nl.yeswecanclinics.chat/.Start:4712個MS(總384269毫秒)

8月5日至12日:40:37.114:d/dalvikvm(175):GC_EXPLICIT釋放對象444 /在122ms

22064字節的I按下返回按鈕

8月5日至12日:41:07.253 :W/KeyCharacterMap(506):無鍵盤ID 0

0 5-12 08:41:07.253:W/KeyCharacterMap(506):使用默認鍵盤映射: /system/usr/keychars/qwerty.kcm.bin

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

八月5日至12日:41:07.403:I/CONN(506):停止

八月5日至12日:41:07.784:W/InputManagerService(70):啓動對 非輸入-focused客戶 [email protected] (UID = 10032 PID = 506)

8月5日至12日:41:07.804:W/IInputConnect ionWrapper(506):showStatusIcon上 非活動InputConnection

八月5日至12日:41:08.173:I/CONN(506):的onStop

八月5日至12日:41:08.173:I/CONN(506) :的onDestroy

我重啓APP通過點擊圖標

八月5日至12日:41:30.583:I /全球(506):默認緩衝在 的BufferedReader構造函數中使用的大小。如果需要一個8k-char緩衝區,那麼最好是明確的。

05-12 08:41:30.623:I/global(506):在 BufferedWriter構造函數中使用的默認緩衝區大小。如果需要一個8k-char緩衝區,那麼最好是明確的。

8月5日至12日:41:31.663:W/System.err的(506): java.security.KeyStoreException:密鑰庫JKS實施找不到

8月5日至12日:41:31.663:W /系統.ERR(506):在 java.security.KeyStore.getInstance(KeyStore.java:134)

八月5日至12日:41:31.663:W/System.err的(506):在 org.jivesoftware。 (ServerTrustManager.java:61)

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

8月5日至12日:41:31.674:W/System.err的(506):在 org.jivesoftware.smack.PacketReader.parsePackets(PacketReader.java:268)

8月5日至12日:41:31.683:W/System.err的(506):在 org.jivesoftware.smack.PacketReader.access $ 000(PacketReader.java:44)

8月5日至12日: 41:31。683:W/System.err的(506):在 org.jivesoftware.smack.PacketReader $ 1.run(PacketReader.java:71)

八月五日至12日:41:31.984:I /全局(506):默認緩衝區大小用於 BufferedReader構造函數。如果需要一個8k-char緩衝區,那麼最好是明確的。

05-12 08:41:31.994:I/global(506):在 BufferedWriter構造函數中使用的默認緩衝區大小。如果需要一個8k-char緩衝區,那麼最好是明確的。

8月5日至12日:41:32.043:d/AndroidRuntime(506):關閉VM

8月5日至12日:41:32.043:W/dalvikvm(506):線程ID = 1:螺紋與離開 未捕獲的異常(組= 0x4001d800)

8月5日至12日:41:32.214:d/dalvikvm(506):GC_FOR_MALLOC釋放5507對象 /388504字節在147ms

8月5日至12日:41:32.226 :D/NativeCrypto(506):釋放OpenSSL會話

05-12 08:41:32.234:E/AndroidRuntime(506):致命例外:main

05-12 08:41:32.234:E/AndroidRuntime(506):java.lang.RuntimeException: 無法啓動活動 ComponentInfo {nl.yeswecanclinics.chat/nl.yeswecanclinics.chat.Start}: 顯示java.lang.NullPointerException

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

8月5日至一十二日:41:32.234:E/AndroidRuntime(506):在 android.app.ActivityThread.handleLaunchActivi TY(ActivityThread.java:2679)

8月5日至12日: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)

8月5日至12日:41:32.234:E/AndroidRuntime( 506):at android.os.Handler.dispatchMessage(Handler.java:99)

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

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

8月5日至12日:41:32.234:E/AndroidRuntime(506):在 java.lang.reflect.Method.invokeNative(本機方法)

8月5日至12日:41:32.234:電子/ AndroidRuntime(506):at java.lang.reflect.Method.invoke(Method.java:521)

05-12 08:41:32.234:E/AndroidRuntime(506):at 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)

八月5日至12日:41:32.234:E/AndroidRuntime(506):在 dalvik.system.NativeStart.main(本機方法)

8月5日至12日:41:32.234:E/AndroidRuntime(506): 顯示java.lang.NullPointerException

8月5日至12日:產生的原因: 41:32.234:E/AndroidRuntime(506):at org.jivesoftware.smackx.muc.MultiUserChat $ 1.connectionCreated(MultiUserChat.java:114)

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

8月5日至12日:41:32.234:E/AndroidRuntime(506):在 org.jivesoftware.smack.XMPPConnection.connectUsingConfiguration(XMPPConnection.java:565)

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

8月5日至一十二日:41:32.234:E/AndroidRuntime(506):在 nl.yeswecanclinics.chat.Start.initConnection(Start.java:131)

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

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

8月5日至12日:41:32.234:E/AndroidRuntime(506):在 android.app。 ActivityThread.performLaunchActivity(ActivityThread.java:2627)

05-12 08:41:32.234:E/AndroidRuntime(506):... 11更多

+0

你可以發佈你的logcat輸出嗎? –

+0

如何發佈:-) – user1273768

+0

轉到「窗口 - >顯示視圖 - >其他視圖」,然後找到並單擊「Logcat」。然後運行你的程序,直到你得到'NullPointerException',然後在這裏發佈相關的logcat輸出(告訴你哪行出現'NullPointerException'的東西)。您還應該告訴我們發生了'NullPointerException'的哪一行(因爲我們不知道確切的行號)。 –

回答

0

您在stopConnection方法nullconnection所以當你嘗試做檢查if(connection.isConnected())收到null,因爲你把它設置。如果connection不是null,您應該檢查startConnection方法,否則您必須撥打initConnection方法。

+0

你可能想使用內聯代碼而不是** bold **來使用刻度標記(shift +〜) –

+0

我在'if(connection == null){'中改變了它''但它沒有任何區別。在我的日誌中,我看不到任何像onResume或onRestart這樣的應用程序永遠不會到達該事件 – user1273768

1

雖然Marek的回答當然不是不正確的(這實際上可能是爲什麼你得到一個NullPointerException),但我知道的一件事是,你不應該試圖在UI線程上進行連接。這將不可避免地導致您的應用程序崩潰,因爲它需要幾秒鐘才能建立連接。您應該製作一個AsnycTask並在那裏進行連接和狀態更改。

+0

行。我會改變這一點。但我仍然不明白爲什麼onResume或onRestart事件從未達到過。當我第一次啓動應用程序時,我只能看到日誌中的事件。我想我可以通過在stopConnection()中加入'System.exit(0)'來解決這個問題。 – user1273768

相關問題