2014-05-23 30 views
23

我知道有對NPE許多不同的原因,但我的是稍顯怪異(至少對我來說)。的NullPointerException上getActivity()。runOnUiThread(新的Runnable(){

所以我將我ActivitiesFragments成功,但我的問題似乎來自顯示日期的函數,當應用程序正在運行時,一切正常,但只要按下後退按鈕,應用程序組合就會關閉,然後在日誌中它說我'因爲看代碼,我在這方面做了一些研究,但不幸沒有得到任何答案。

這是錯誤i來自當你按下後退按鈕時。

getActivity().runOnUiThread(new Runnable(){ 

此外,我已嘗試禁用後退按鈕(因爲我建立一個發射器,它不需要)。但它似乎並沒有工作。

這裏是整個日期顯示方法/函數的代碼。

// (Calendar) Date function - Displays dateview on Card 
final boolean keepRunning1 = true; 
Thread thread_two = new Thread(){ 
    @Override 
    public void run(){ 

     while(keepRunning1){ 

      // Make the thread wait half a second. If you want... 
      try { 
       Thread.sleep(500); 
      } catch (InterruptedException e) { 
       Toast.makeText(getActivity().getApplicationContext(), "Default Signature Fail", Toast.LENGTH_LONG).show(); 
       e.printStackTrace(); 
      } 

       getActivity().runOnUiThread(new Runnable(){ 
       @Override 
       public void run(){ 
        TextView date = (TextView) getView().findViewById(R.id.date); 
        date.setText(DateUtils.formatDateTime(getActivity().getBaseContext(), System.currentTimeMillis(),DateUtils.FORMAT_SHOW_WEEKDAY | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_YEAR)); 
       } 
      }); 
     } 
    } 
}; 

thread_two.start(); 

感謝您的時間,希望您能對我做錯的事情有所瞭解。

的logcat -

05-23 21:17:33.216: E/AndroidRuntime(6906): java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v4.app.FragmentActivity.runOnUiThread(java.lang.Runnable)' on a null object reference 
05-23 21:17:33.216: E/AndroidRuntime(6906):  at com.activelauncher.fragments.UtilsFragment$2.run(UtilsFragment.java:102) 
+2

有可能在後退按鈕單擊時「Activity」被關閉,因此您將getActivity()作爲null – Apoorv

+0

@Apoorv如何停止關閉後退按鈕時的活動? – Robin

回答

45

我幾乎可以肯定,這是當線程完成其工作引起的,但活動不再可見。

你應該檢查getActivity()調用返回和...

要在你的代碼申請更正,看看這個:

// (Calendar) Date function - Displays dateview on Card 
final boolean keepRunning1 = true; 
Thread thread_two = new Thread(){ 

@Override 
public void run(){ 

    while(keepRunning1){ 

     // Make the thread wait half a second. If you want... 
     try { 
      Thread.sleep(500); 
     } catch (InterruptedException e) { 
      Toast.makeText(getActivity().getApplicationContext(), "Default Signature       Fail", Toast.LENGTH_LONG).show(); 
      e.printStackTrace(); 
     } 

     // here you check the value of getActivity() and break up if needed 
     if(getActivity() == null) 
      return; 

     getActivity().runOnUiThread(new Runnable(){ 
     @Override 
     public void run(){ 
      TextView date = (TextView) getView().findViewById(R.id.date); 
      date.setText(DateUtils.formatDateTime(getActivity().getBaseContext(), System.currentTimeMillis(),DateUtils.FORMAT_SHOW_WEEKDAY | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_YEAR)); 
      } 
     }); 
    } 
} 
};thread_two.start(); 
+0

@FaroukTouzi反正我想執行'runOnUiThread'內的代碼。如果我這樣做,那麼它裏面的代碼將不會被執行嗎? – Jas

+1

就像我上面所說的,如果主要活動不再可見,runOnUiThread中的代碼將不會被執行。這就是爲什麼你應該總是檢查主要活動的可見性,以避免應用程序崩潰。 –

4

試試這個

TextView date = (TextView) getView().findViewById(R.id.date); 

是日期爲空或不檢查

if(date !=null){ 
        date.setText(DateUtils.formatDateTime(getActivity().getBaseContext(), System.currentTimeMillis(),DateUtils.FORMAT_SHOW_WEEKDAY | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_YEAR)); 
} 
10

,你的後臺線程仍在運行逼人退之後。當線程到達getActivityrunOnUiThread()代碼時,該活動不再存在。檢查活動仍然存在likeso:

if (getActivity()!=null) { 
     getActivity().runOnUiThread(new Runnable(){ 
       @Override 
       public void run(){ 
        TextView date = (TextView) getView().findViewById(R.id.date); 
        date.setText(DateUtils.formatDateTime(getActivity().getBaseContext(), System.currentTimeMillis(),DateUtils.FORMAT_SHOW_WEEKDAY | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_YEAR)); 
      } 
     }); 
} 
8

的原因NPE是你的線程未綁定到片段生命週期。一旦該片段脫離其託管活動,getActivity()將返回null。

作爲解決方案,請考慮完全刪除線程,並在UI線程上的Handler上使用postDelayed()來發布Runnable,這些延遲後會執行所需的更新。

+0

Handler的postDelayed方法getActivity()爲null :( – developer1011

8

if(getActivity() == null) 
     return; 

getActivity().runOnUiThread(new Runnable(){之前,這樣一來當返回按鈕被關閉,你的Thread仍然在運行,它會檢查呼叫Activity是否仍然存在。

如果不是,它會return

+0

但是應該發生的操作是什麼?如果getActivity()爲null,則返回''但是必須再次調用該方法它可以在getActivity()不爲空時完成... –

相關問題