Java 用于隔离代码的隐藏片段

Java 用于隔离代码的隐藏片段,java,android,android-fragments,Java,Android,Android Fragments,我的问题是如何将活动所需的某些功能隔离到一个隐藏片段中,在本例中是位置服务 我最初的想法是将与位置服务相关的样板回调传递到一个单独的普通Java实用程序类中,并在活动中只保留onLocationChanged的侦听器。这样会更干净。 问题是,这会导致循环依赖,因为pojo将需要对某些调用的活动上下文进行引用,而活动将具有对实用程序类的引用,从而导致循环依赖,从而导致紧密耦合 因此,我的想法是制作一个隐藏的片段并将代码存储在那里;这将保持主活动中的代码干净。 通常的做法是什么 我使用的当前代码:

我的问题是如何将活动所需的某些功能隔离到一个隐藏片段中,在本例中是位置服务

我最初的想法是将与位置服务相关的样板回调传递到一个单独的普通Java实用程序类中,并在活动中只保留
onLocationChanged
的侦听器。这样会更干净。
问题是,这会导致循环依赖,因为pojo将需要对某些调用的活动上下文进行引用,而活动将具有对实用程序类的引用,从而导致循环依赖,从而导致紧密耦合

因此,我的想法是制作一个隐藏的片段并将代码存储在那里;这将保持主活动中的代码干净。
通常的做法是什么

我使用的当前代码:

public class HomeActivity extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, com.google.android.gms.location.LocationListener{
    private static final String TAG = "HOME_ACTIVITY"; // Logging

    private GoogleApiClient     mGoogleApiClient;
    private Location            mLocation;
    private LocationManager     mLocationManager;
    private LocationRequest     mLocationRequest;
    private com.google.android.gms.location.LocationListener listener;

    private double mLatCurLoc;
    private double mLngCurLoc;

    private float  MIN_DISTANCE = 200.0f;
    private long   UPDATE_INTERVAL = 2 * 1000;  /* 10 secs */
    private long   FASTEST_INTERVAL = 2000; /* 2 sec */

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);

        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .addApi(LocationServices.API)
                .build();

        mLocationManager = (LocationManager)this.getSystemService(Context.LOCATION_SERVICE);

    }

    @Override
    protected void onResume(){
        super.onResume();
    }

    @Override
    public void onBackPressed() {
        moveTaskToBack(true);
    }

    @Override
    public void onConnected(Bundle bundle) {
        // Android Studio complains that we should check the permissions before getting last location
        // However, we have already checked permissions in the previous activity
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            return;
        }

        startLocationUpdates();
        mLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);

        if(mLocation == null){
            startLocationUpdates();
        }
        if (mLocation != null) {

        } else {
            Toast.makeText(this, "Location not Detected", Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    public void onConnectionSuspended(int i) {
        Log.i(TAG, "Connection Suspended");
        mGoogleApiClient.connect();
    }

    @Override
    public void onConnectionFailed(ConnectionResult connectionResult) {
        Log.i(TAG, "Connection failed. Error: " + connectionResult.getErrorCode());
    }

    @Override
    protected void onStart() {
        super.onStart();
        if (mGoogleApiClient != null) {
            mGoogleApiClient.connect();
        }
    }

    @Override
    protected void onStop() {
        super.onStop();
        if (mGoogleApiClient.isConnected()) {
            mGoogleApiClient.disconnect();
        }
    }

    protected void startLocationUpdates() {
        // Create the location request
        mLocationRequest = LocationRequest.create()
                .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
                .setInterval(UPDATE_INTERVAL)
                .setSmallestDisplacement(MIN_DISTANCE)
                .setFastestInterval(FASTEST_INTERVAL);
        // Request location updates
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            return;
        }
        LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient,
                mLocationRequest, this);
    }

    @Override
    public void onLocationChanged(Location location) {
        mLatCurLoc = location.getLatitude();
        mLngCurLoc = location.getLongitude();
        String msg = "Updated Location: " +
                Double.toString(location.getLatitude()) + "," +
                Double.toString(location.getLongitude());
        Log.i("LOCATION_CHANGED", msg);
    }


}

我认为这就是OOP中的继承之美。你只需要有一个处理定位服务的活动,并使你的其他想要处理定位的活动扩展,例如
locationawa
。当其中一个活动对位置不感兴趣时,您只需更改父类,反之亦然,当您的一个活动希望了解位置时,它将扩展
位置
我认为这就是OOP中继承的美妙之处。你只需要有一个处理定位服务的活动,并使你的其他想要处理定位的活动扩展,例如
locationawa
。当其中一个活动对位置不感兴趣时,您只需更改父类,反之亦然,当您的一个活动希望了解位置时—它将扩展
locationawa

继承不是更干净的体系结构吗?当您不再需要位置功能时,只需更改父类即可。或者如果其他活动也需要位置,只需扩展同一个超类。@azizbekian听起来是个不错的选择。我们的应用程序依赖于位置服务,所以继承应该是可能的。总的来说,我倾向于避免继承,但在这种情况下,我认为它可能会有所不同。我将作为答案发布。也许有人会提出更合适的建议,我们拭目以待。继承有其利弊。这里有一个很好的讨论:。我会选择作文而不是继承。但关于你的问题,这是个人偏好。你的类是干净且短的(实际上可能会有一些清理,如果块损坏,则为空:P,对我的口味来说,它有点太长),并且将来可以很容易地重构-当你将来更改它时,总是质疑类的“美”。@slowy是的,当然,它仍然处于演示模式。该应用程序依赖于位置服务(如果没有它,应用程序的核心概念就会崩溃),因此在这种情况下继承将是一个很好的选择。我想我可以使用回调或承诺来实现组合,但是继承命题对我来说很好,而且就其目的而言更简单。谢谢。继承不是更干净的架构吗?当您不再需要位置功能时,只需更改父类即可。或者如果其他活动也需要位置,只需扩展同一个超类。@azizbekian听起来是个不错的选择。我们的应用程序依赖于位置服务,所以继承应该是可能的。总的来说,我倾向于避免继承,但在这种情况下,我认为它可能会有所不同。我将作为答案发布。也许有人会提出更合适的建议,我们拭目以待。继承有其利弊。这里有一个很好的讨论:。我会选择作文而不是继承。但关于你的问题,这是个人偏好。你的类是干净且短的(实际上可能会有一些清理,如果块损坏,则为空:P,对我的口味来说,它有点太长),并且将来可以很容易地重构-当你将来更改它时,总是质疑类的“美”。@slowy是的,当然,它仍然处于演示模式。该应用程序依赖于位置服务(如果没有它,应用程序的核心概念就会崩溃),因此在这种情况下继承将是一个很好的选择。我想我可以使用回调或承诺来实现组合,但是继承命题对我来说很好,而且就其目的而言更简单。谢谢,我同意你的看法。由于紧密耦合,我已经习惯于避免继承,因此我不再将其视为一种选择。但这里有明确的用例。做得好!我同意你的看法。由于紧密耦合,我已经习惯于避免继承,因此我不再将其视为一种选择。但这里有明确的用例。做得好!