2014-05-23 8 views
23

मैं जानता हूँ कि NPE लिए कई अलग अलग कारण होते हैं लेकिन मेरा (कम से कम मेरे लिए थोड़ा अजीब है)।NullPointerException (नई Runnable() {

तो मैं अपने ActivitiesFragments सफलतापूर्वक करने के लिए परिवर्तित कर दिया है , लेकिन मेरी समस्या उस कार्य से आ रही है जो तिथि प्रदर्शित करती है। जब एप्लिकेशन चल रहा है, तो सबकुछ ठीक काम करता है। लेकिन जैसे ही आप बैक बटन दबाते हैं। ऐप फोर्स बंद हो जाता है, फिर लॉग में यह कहता है कि मैं ' मीटर लाइन 102 पर NullPointerException रही तो कोड को देखते हुए, मैं इस पर शोध किया लेकिन दुर्भाग्य से कुछ भी नहीं मिला है।

इस लाइन है, जहां त्रुटि मैं जब आप बैक बटन दबाते हैं तब से आ रहा है।

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

यह संभव है कि 'गतिविधि' बैक बटन क्लिक पर बंद हो रहा है और इसलिए आपको 'getActivity() 'शून्य के रूप में प्राप्त हो रहा है – 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

एनपीई के लिए कारण यह है कि है आपके धागा टुकड़े जीवन चक्र से बंधे नहीं है। एक बार टुकड़े को अपनी होस्टिंग गतिविधि से अलग कर दिया जाता है, getActivity() शून्य लौटाता है।

एक समाधान के रूप में, धागा पूरी तरह हटाने पर विचार और सिर्फ Runnable रों है कि आप एक विलंब के बाद चाहते अपडेट कर पोस्ट करने के लिए यूआई धागे पर एक Handler पर postDelayed() का उपयोग करें।

+0

पोस्ट के अंदर हैंडलर की डिलीडेड विधि प्राप्त करने के लिए निष्क्रियता() को शून्य के रूप में प्राप्त किया गया है :( – developer1011

8

getActivity().runOnUiThread(new Runnable(){ से पहले इस तरह रखो

if(getActivity() == null) 
     return; 

जब वापस बटन बंद कर दिया है और अपने Thread अभी भी यह जाँच करेगा बुला Activity अभी भी मौजूद है कि क्या चल रहा है।

यदि यह return नहीं होगा।

+0

लेकिन ऑपरेशन के बारे में क्या होना चाहिए था? अगर 'निष्क्रियता') शून्य हो, तो आप 'वापसी' कर सकते हैं, लेकिन फिर कुछ विधि को फिर से कॉल करना होगा यह पूरा हो सकता है जब 'निष्क्रियता() 'शून्य नहीं है ... –

संबंधित मुद्दे