【问题标题】:Variable is showing value as null even when I had set already value of it即使我已经设置了它的值,变量也将值显示为 null
【发布时间】:2019-11-17 12:05:26
【问题描述】:

我已经创建了后台服务来连接我的套接字服务器,它在应用程序关闭时在后台工作,当用户打开应用程序 MainActivity 加入我的服务类并且看起来不错时,我的服务可以更改主要活动中的片段,但是当它断开连接并想要更改主要活动中的片段然后应用程序崩溃

检查我的 MainActivity

public class MainActivity extends AppCompatActivity {

    private clientService mclientService;
    private Intent mServiceIntent;
    private final FragmentManager fm = getFragmentManager(); 

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mclientService = new clientService(this);
        mServiceIntent = new Intent(this, mclientService.getClass());
        if (!isMyServiceRunning(mclientService.getClass())) {
            startService(mServiceIntent);
        } 
    }
    public Fragment changeFragment (Fragment cls) {
        FragmentTransaction ft = this.fm.beginTransaction();
        ft.replace(R.id.bodyFrame, cls);
        ft.commit(); 
        return cls;
    }
 

    private boolean isMyServiceRunning(Class<?> serviceClass) {
        ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
            if (serviceClass.getName().equals(service.service.getClassName())) {
                Log.i ("isMyServiceRunning?", true+"");
                return true;
            }
        }
        Log.i ("isMyServiceRunning?", false+"");
        return false;
    }

}

和客户端服务:

public class clientService extends Service {

    private Socket mSocket;
    {
        try {
            IO.Options opts = new IO.Options();
            opts.query = "_d=jakistakiid";
            mSocket = IO.socket("http://10.0.2.2:3000", opts);
        } catch (URISyntaxException e) {}
    }


    public clientService(MainActivity main) {
        super();
        mainAttach(main);
    }
    public clientService() {
    }
    public MainActivity mMain;


    public void startIt(){
        Log.i("eroapp", "Service Started");
        if(mSocket != null) {
            mSocket.on(Socket.EVENT_CONNECT, new Emitter.Listener() {
                @Override
                public void call(Object... args) {
                    Log.i("eroapp", "connected");
                }
            }).on(Socket.EVENT_DISCONNECT, new Emitter.Listener() {
                @Override
                public void call(Object... args) {
                    Log.i("eroapp", "dc:"+mMain);
                   onDC();
                }
            });
            mSocket.connect();
        }

    } 

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        super.onStartCommand(intent, flags, startId);
        startIt();
        return START_STICKY;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Intent broadcastIntent = new Intent(this, restartReceiver.class);
        sendBroadcast(broadcastIntent);
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }



    // CLIENT FUNCTIONS //
    private void onDC(){
        Log.i("eroapp", "DC:"+mMain);
    }

    private void mainAttach(MainActivity m) {
        mMain = m;
        Log.i("eroapp","Main created!");
        if(!mSocket.connected()) {
            mMain.changeFragment(new offlineFragment());
        }else{
            mMain.changeFragment(new singFragment());
        }
    }
  
}

看起来不错,当我关闭应用程序活动时,我的服务重新启动并在后台运行,它在 logcat 中显示:

2019-11-17 02:41:22.686 17458-17458/com.example.secmsg I/eroapp:服务已启动

2019-11-17 02:41:22.803 17458-17483/com.example.secmsg I/eroapp:已连接

当我再次打开应用程序时,我的服务已经在运行,所以它只运行 clientService 中的 mainAttach 函数,然后在 main Activity 中运行 changeFragment 函数,效果很好,但是 当我与服务器断开连接时,它说 mMain 为 null ;

2019-11-17 02:41:31.654 17458-17499/com.example.secmsg I/eroapp: dc:null

2019-11-17 02:41:31.654 17458-17499/com.example.secmsg I/eroapp: DCnull

【问题讨论】:

    标签: java android sockets


    【解决方案1】:

    您在MainActivity上创建的mclientService与您调用startService(intent)时Android系统启动的clientService不同。 Android 系统使用服务类的空构造函数创建和启动的所有服务,因此永远不会调用clientService#mainAttach请查看此answer 了解更多信息。

    如果您想直接与MainActivity 上的服务交互,您可能需要将服务绑定到您的活动。查看有关绑定服务here的文档。

    另一件事...看起来您正计划使用对活动的引用直接控制服务中的MainActivity。请永远不要这样做,而是使用广播。祝你好运!

    【讨论】:

      猜你喜欢
      • 2016-02-06
      • 2011-06-25
      • 1970-01-01
      • 1970-01-01
      • 2020-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-24
      相关资源
      最近更新 更多