以横向模式启动片段

时间:2014-07-31 01:35:47

标签: java android multithreading android-fragments

提前感谢您的帮助。 我正在尝试加载我的一个片段,它通过调用

从横向模式的drawerlayout活动加载
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

片段以横向模式加载。我还有一个可运行的线程,它在片段绑定到后台服务后从onStart()开始,并且runnable被杀死onStop()。

private final Runnable initCommands = new Runnable() {
    @Override
    public void run() {
        Log.d(TAG,"running thread");
        if(isServiceBound) {

            //some code...
            new Handler().postDelayed(initCommands,800);
        }
    }
};

在片段绑定服务后启动runnable:

private ServiceConnection serviceConn = new ServiceConnection() {
    public void onServiceConnected(ComponentName className, IBinder binder) {
        ELMScanner.ELMScannerServiceBinder serviceBinder = (ELMScanner.ELMScannerServiceBinder) binder;
        scanner = serviceBinder.getService();
        isServiceBound = true;
        if (scanner.isConnected()) {

            Log.d(TAG,"init commands");

            new Handler().post(initCommands);
        }
    }

    public void onServiceDisconnected(ComponentName className) {
        isServiceBound = false;
        scanner.resetCommands();
    }
};

@Override
public void onStop() {
    super.onStop();
    Log.d(TAG,"onStop");
    FRAGMENT_RUNNING = 0;
    if (isServiceBound) {
        getActivity().getApplicationContext().unbindService(serviceConn);
        Log.d(TAG,"unbinding service");
        isServiceBound = false;
        scanner.resetCommands();
    }

}

我面临的问题来自setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)。由于某种原因,此方法重新加载片段而不是杀死第一个线程,因此有两个线程实例在运行。

07-30 18:38:53.054    2940-2940/com.package/FuelFragment﹕ on Attach
07-30 18:38:53.054    2940-2940/com.package/FuelFragment﹕ onCreate
07-30 18:38:53.054    2940-2940/com.package/FuelFragment﹕ onCreatView
07-30 18:38:53.054    2940-2940/com.package/FuelFragment﹕ onstart
07-30 18:38:53.062    2940-2940/com.package/FuelFragment﹕ onStop
07-30 18:38:53.062    2940-2940/com.package/FuelFragment﹕ on Detach
07-30 18:38:53.070    2940-2940/com.package/ApplicationPackageManager﹕ cscCountry is not German : THR
07-30 18:38:53.070    2940-2940/com.package/FuelFragment﹕ on Attach
07-30 18:38:53.070    2940-2940/com.package/FuelFragment﹕ onCreate
07-30 18:38:53.242    2940-2940/com.package/FuelFragment﹕ onCreatView
07-30 18:38:53.250    2940-2940/com.package/FuelFragment﹕ onstart
07-30 18:38:53.257    2940-2940/com.package/FuelFragment﹕ init commands
07-30 18:38:53.257    2940-2940/com.package/FuelFragment﹕ init commands
07-30 18:38:53.328    2940-2940/com.package/FuelFragment﹕ running thread

我的问题:是否有一个替代的setRequestedOrientation()不会重新加载片段?

感谢。

解决方案:

如果你想知道如何解决这个问题。

在onStart()方法中,添加条件

int orientation = getResources().getConfiguration().orientation;

    if (orientation == 2) {
        Intent serviceIntent = new Intent(getActivity(), ELMScanner.class);
        getActivity().getApplicationContext().bindService(serviceIntent, serviceConn, Context.BIND_AUTO_CREATE);
    }

这将确保片段仅绑定到服务并在横向模式下启动时运行该线程。还要确保添加

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

}

@Override
public void onDetach() {
    super.onDetach();
    getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);

}

1 个答案:

答案 0 :(得分:0)

AFAIK,没有。方向更改需要重新启动Activity / Fragment,以便系统有机会重新加载所有资源。

来自docs的setRequestedOrientation:

  

更改此活动的所需方向。如果活动是   目前处于前台或以其他方式影响屏幕   方向,屏幕将立即更改(可能导致   要重新启动的活动)。否则,这将在下一个使用   活动可见的时间。

您的代码应该能够处理被销毁和重新创建而不会搞乱并创建两个线程。我们不清楚你要完成什么,所以我无法给你任何进一步的建议,但是正确处理活动生命周期是必要的。