2017-02-25 2 views
0

Ich habe ein Fragment, die einen Hintergrund-Thread, die Aktualisierung eines Fortschrittsbalken Wert und ändern Sie die Fortschrittsbalken Zeichnungsfähig, wenn der Fortschritt Wert einen bestimmten Wert zu erreichen, wenn ich onther Fragment zu starten versuchen im gleichen Fall Aktivität es dieser FehlerKilling ein Hintergrund Thread, wenn ein Fragment zerstört

E/UncaughtException: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.support.v4.app.FragmentActivity.getResources()' on a null object reference 
    at com.example.mego.adas.ui.CarFragment$PotProgressThread$1.run(CarFragment.java:831) 
    at android.os.Handler.handleCallback(Handler.java:739) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
    at android.os.Looper.loop(Looper.java:148) 
    at android.app.ActivityThread.main(ActivityThread.java:7409) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.mego.adas, PID: 25935 
java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.support.v4.app.FragmentActivity.getResources()' on a null object reference 
    at com.example.mego.adas.ui.CarFragment$PotProgressThread$1.run(CarFragment.java:831) 
    at android.os.Handler.handleCallback(Handler.java:739) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
    at android.os.Looper.loop(Looper.java:148) 
    at android.app.ActivityThread.main(ActivityThread.java:7409) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 

hier ist der Code für den Thread

class PotProgressThread implements Runnable { 

    @Override 
    public void run() { 
     while (potSensorValue <= 1025 && fragmentIsRunning) { 

      if (fragmentIsRunning) { 

       // Update the progress bar 
       potProgressBarHandler.post(new Runnable() { 
        public void run() { 
         potProgressBar.setProgress((int) potSensorValue); 
         if (potSensorValue >= 800) { 
          potProgressBar.setProgressDrawable(getActivity(). 
            getResources().getDrawable(R.drawable.progressbarred)); 
         } else { 
          potProgressBar.setProgressDrawable(getActivity(). 
            getResources().getDrawable(R.drawable.progressbarblue)); 

         } 
        } 
       }); 
       try { 
        Thread.sleep(50); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } else { 
       break; 
      } 
     } 
    } 
} 

hier, wo ich meinen Thread werfen beginnen in onCreateView() -Methode

Hier ist der Code auf onDestoryview() -Methode

fragmentIsRunning = false; 
potThread.interrupt(); 

wie kann ich es töten

+0

Bitte teilen Sie Ihre 'onCreateView()' Methode Code. – Shailesh

+0

ok ich werde die Frage bearbeiten –

+0

getan überprüfen .. –

Antwort

0

Dalvik alle Themen Referenzen in der Laufzeit hält so Ihr Thread läuft weiter, es sei denn es beendet oder abgeschlossen (einige reference). Je nachdem, wo Sie Ihren Thread starten, erstellen Sie möglicherweise mehrere.

In Ihrem Fall Ihre Thread-Ausführung ist nicht abgeschlossen und Sie ändern das Fragment, so dass Ihre getActivity() wird Null.

Die Lösung ist vor getActivity(), überprüfen Sie isAdded() ist wahr oder nicht, wenn nicht wahr, das bedeutet, das Fragment ist bereits getrennt, Anruf an getActivity() wird Null zurückgeben.

Erinnern Sie sich im Thread, überall, bevor Sie getActivity() anrufen, sollten Sie IsAdded() erneut überprüfen, da Benutzer die Aktivität jederzeit während der Ausführung des Threads beenden kann.

andere Lösung

Ich bin nicht sicher, aber Sie können von Context global und Sie, dass Kontext in Ihrem Thread erreichen initialisieren.

Context mContext; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) 
{ 
    mContext = getActivity(); 
    .... 
} 

Verwenden Sie jetzt diesen Kontext in Ihrem Thread.

class PotProgressThread implements Runnable { 

    @Override 
    public void run() { 
     while (potSensorValue <= 1025 && fragmentIsRunning) { 

      if (fragmentIsRunning) { 

       // Update the progress bar 
       potProgressBarHandler.post(new Runnable() { 
        public void run() { 
         potProgressBar.setProgress((int) potSensorValue); 
         if (potSensorValue >= 800) { 
          potProgressBar.setProgressDrawable(mContext. 
            getResources().getDrawable(R.drawable.progressbarred)); 
         } else { 
          potProgressBar.setProgressDrawable(mContext. 
            getResources().getDrawable(R.drawable.progressbarblue)); 

         } 
        } 
       }); 
       try { 
        Thread.sleep(50); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } else { 
       break; 
      } 
     } 
    } 
} 

Ich hoffe, Sie werden die Lösung bekommen.

+0

ok vielen Dank sehr für diese die erste Lösung ist Arbeit für mich gut, ich habe es nicht versucht Zweitens, aber ich denke, es wird nicht funktionieren, weil der Fehler passiert, wenn ich zu anderen Fragment nicht gehe, wenn ich dieses Fragment zu starten –

Verwandte Themen