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和使用一个处理器上的服务端来执行所需的操作。