0

我有一個啓動的服務,一些活動必須綁定到它才能在設置視圖之前獲取一些數據。一切工作正常,但一些(很少)時間,我得到了一個N​​ullPointerException。我的簡化活動是:服務異常NullPointerException

public class MyActivity extends Activity { 
    TextView tvName; 
    boolean mIsMyServiceBound; 
    MyService mMyService; 

    private ServiceConnection mConnection = new ServiceConnection() { 

     @Override 
     public void onServiceConnected(ComponentName className, IBinder service) { 
      MyService.MyServiceBinder myServiceBinder = (MyService.MyServiceBinder) service; 
      mMyService = myServiceBinder(); 
      mIsMyServiceBound = true; 

      // Set up views 
      tvName.setText(mMyService.getName()); 
     } 

     @Override 
     public void onServiceDisconnected(ComponentName className) { 
      mIsMyServiceBound = false; 
      mMyService = null; 
     } 
    }; 

    @Override 
    public void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.yourlayout); 
     tvName = (TextView) findViewById(R.id.tv_name); 
     ... 
    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 
     // Bind to LocalService 
     Intent intent = new Intent(this, ChatService.class); 
     bindService(intent, mConnection, Context.BIND_AUTO_CREATE); 
     mIsChatServiceBound = true; 
    } 

    @Override 
    protected void onStop() { 
     super.onStop(); 
     // Unbind from the service 
     if (mIsChatServiceBound) { 
      unbindService(mConnection); 
      mIsChatServiceBound = false; 
     } 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     tvName = null; 
    } 
} 

那麼,它通常工作正常。但這樣做,當我有一個NullPointerException:

tvName.setText(mMyService.getName()); 

錯誤告訴tvName是空的,但我不明白這怎麼可能,因爲它的onCreate後調用。這個錯誤很少發生,但這很煩人。可能該活動已被銷燬,但服務連接偵聽器未取消?如果這是真的,當活動被破壞時我怎麼能取消那個服務連接?

在此先感謝!

+1

你沒有擴展'活動'或類似的東西,請不要過分簡化你在這裏發佈的代碼。您可能會創造比您更多的錯誤,我們無法爲您提供幫助。 – yennsarah

+0

我編輯了代碼,我忘了寫它。對不便,我已經更新了代碼。 – FVod

+0

爲什麼你在'onDestroy()'中設置'tvName'爲null?如果你簡單地添加一個if(tvName == null)//做一些其他的事情,也許重新開始這個活動,否則tvName.setText(「」)',你不會得到這個崩潰。 – yennsarah

回答

0

試試這個。這是因爲丟失

setContentView(R.layout.yourlayout); 
中的onCreate Method.You

需要擴展到活動課呢 希望它helps.thanks

+0

謝謝,我忘了寫在我簡化的例子上。對不起,我現在編輯它,因爲setcontentView是在我的真實代碼中,否則它總是會崩潰。謝謝你的回答,你有什麼線索可能會發生什麼? – FVod

0

你忘了寫setcontentView(R.layout.activity_main)活動

@Override 
public void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setcontentView(R.layout.activity_main) 
    tvName = (TextView) findViewById(R.id.tv_name); 
} 

希望這會對你有幫助。

+0

謝謝,我忘了寫在我簡化的例子上。對不起,我現在編輯它,因爲setcontentView是在我的真實代碼中,否則它總是會崩潰。謝謝你的回答,你有什麼線索可以發生什麼? – FVod

+0

@FVod,確保你的佈局中帶有tv_name id的textview –

+0

是的,它存在。事實上,錯誤發生的時間很少。這就是爲什麼我認爲這裏有些奇怪的東西,比如在服務連接偵聽器尚未被觸發時破壞活動。你怎麼看? – FVod

0

嘗試查看如果您打開活動並快速旋轉手機後會發生什麼情況。如果您的服務連接和活動週期出現問題,您應該可以通過這種方式發現問題。此外,作爲解決方法,您可以嘗試在onServiceConnected內部獲得對TextView的引用,並進行完整性檢查。 (雖然很奇怪,但第一次聽說這個,它可能與你的應用程序體系結構有關)。 另外這裏:

MyService.MyServiceBinder myServiceBinder = (MyService.MyServiceBinder)service; mMyService = myServiceBinder();

你不應該使用服務這種方式,而不是創建一個從活頁夾中Messenger和使用一個處理器上的服務端來執行所需的操作。