質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.10%

Serviceを作りました。コードが汚いと言われました。どこが問題でしょうか?

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 1,613

score 13

このServiceで、やりたいことはできるのですが、先輩にこれじゃ、改善しないと使えないって言われました。コードが汚いってことだと思うんですが、どこが問題でしょうか?

import android.app.Service;
import android.content.Intent;
import android.location.Criteria;
import android.location.LocationManager;
import android.os.Binder;
import android.os.IBinder;
import android.location.LocationListener;
import android.content.pm.PackageManager;
import android.location.Location;
import android.support.v4.app.ActivityCompat;
import android.os.Bundle;
import android.util.Log;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.auth.FirebaseAuth;

public class GpsService extends Service implements LocationListener{

    private final String TAG ="GpsService";
    final FirebaseDatabase database = FirebaseDatabase.getInstance();


    public class GpsServiceBinder extends Binder {
        public GpsService getService() {
            return GpsService.this;
        }
    }

    @Override
    public void onCreate() {
        super.onCreate();
    }

    public GpsService() {
    }

    //removeupdatesは必要
    //    @Override
    //    protected void onPause(){
    //        super.onPause();
    //        locationManager.removeUpdates(this);
    // mLocationManager.removeUpdates(listener);
    //    }

    protected void initLocationService() {

        if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            return;
        }
        if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
                ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            return;
        }

        Criteria criteria = new Criteria();
        criteria.setAccuracy(Criteria.ACCURACY_FINE); //setAccuracyは内部では、https://stackoverflow.com/a/17874592/1709287の用にHorizontalAccuracyの設定に変換されている
        criteria.setPowerRequirement(Criteria.POWER_HIGH);
        criteria.setAltitudeRequired(false);
        criteria.setSpeedRequired(true);
        criteria.setCostAllowed(true);
        criteria.setBearingRequired(false);
        criteria.setHorizontalAccuracy(Criteria.ACCURACY_HIGH);
        criteria.setVerticalAccuracy(Criteria.ACCURACY_HIGH);


        LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
        String bestProvider = locationManager.getBestProvider(criteria, true);
        locationManager.requestLocationUpdates(bestProvider, 6000, 1, this);
    }

    @Override
    public void onLocationChanged(Location location) {
        Log.d(TAG,"onLocationChanged");
        refreshGeoLocation(location);
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
    }

    @Override
    public void onProviderEnabled(String provider) {
    }

    @Override
    public void onProviderDisabled(String provider) {
    }

    Double forlatitude;
    Double forlongitude;
    boolean run=false;
    Double pchecklatitude = 0.0;
    Double mchecklatitude = 0.0;
    Double pchecklongitude = 0.0;
    Double mchecklongitude = 0.0;
    Integer count=0;

    protected void refreshGeoLocation(Location location) {
        Log.v(TAG,"refreshGeoLocation");
        String user = FirebaseAuth.getInstance().getCurrentUser().getUid();
        DatabaseReference ref = database.getReference().child("users").child(user);
        DatabaseReference latitudeRef = ref.child("latitude");
        DatabaseReference longitudeRef = ref.child("longitude");


        count++;
        if (count == 1) {
            forlatitude = location.getLatitude();
            forlongitude = location.getLongitude();
        }
        if (run == false) {
            pchecklatitude = forlatitude + 0.00025094944;
            mchecklatitude = forlatitude - 0.00025094944;
            pchecklongitude = forlongitude + 0.00025094944;
            mchecklongitude = forlongitude - 0.00025094944;

                Log.v(TAG,"LocationChange():"+count.toString());
                Log.v(TAG,"getLatitude():"+location.getLatitude()+"pchecklatitude"+pchecklatitude.toString());
                Log.v(TAG,"getLatitude():"+location.getLatitude()+"mchecklatitude"+mchecklatitude.toString());

            if (location.getLatitude() > pchecklatitude || location.getLatitude() < mchecklatitude &&
                    location.getLongitude() > pchecklongitude || location.getLongitude() < mchecklongitude) {

                latitudeRef.setValue(location.getLatitude());
                longitudeRef.setValue(location.getLongitude());
                run = true;

                Log.v(TAG,"移動検知:"+count.toString());
                Log.v(TAG,"getLatitude():"+location.getLatitude()+"pchecklatitude"+pchecklatitude.toString());
                Log.v(TAG,"getLatitude(:)"+location.getLatitude()+"mchecklatitude"+mchecklatitude.toString());

                //ここで保存用に追加
                forlatitude = location.getLatitude();
                forlongitude = location.getLongitude();
            }
        } else if (run == true) {
            latitudeRef.setValue(location.getLatitude());
            longitudeRef.setValue(location.getLongitude());
            Log.v(TAG,"追跡中:"+count.toString());
            Log.v(TAG,"getLatitude():"+location.getLatitude()+"pchecklatitude"+pchecklatitude.toString());
            Log.v(TAG,"getLatitude():"+location.getLatitude()+"mchecklatitude"+mchecklatitude.toString());
        }
    }

    @Override
    public IBinder onBind(Intent intent) {
        throw new UnsupportedOperationException("Not yet implemented");
    }

    private void startLocation() {
        initLocationService();
    }

    private void stopLocation() {
        //firebase.auth().signOut();これでログアウトはできるが、ログアウトはしない
        database.goOffline();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        String check =intent.getStringExtra("start/stop");
        if(check.equals("start")){
            startLocation();
        }else if(check.equals("stop")){
            stopLocation();
        }

        return super.onStartCommand(intent, flags, startId);
    }

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

}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • atatatatata

    2017/07/31 13:32

    コードが汚いとも言っていました。何かアドバイスをもらいたいです

    キャンセル

  • atatatatata

    2017/07/31 13:36

    調べろって言われました。

    キャンセル

  • atatatatata

    2017/07/31 13:36

    見てわかる問題がないならそれでいいんですが、

    キャンセル

回答 4

checkベストアンサー

+5

「誰に質問すべきか」を考えていますか。

先輩が「改善すべき」と言ったのであれば、改善すべき点を知っているのは先輩で先輩に聞くべきです。
ネットで質問しても、得られた回答が先輩の意図したものである可能性は限りなく低いです。

また、仮に改善点を聞いて「自分で考えろ」と言われたのであれば、この質問をしている行為自体が先輩の期待を裏切っています。

また、先輩は「使い物になるように改善しろ」と言ったのであれば、「コードが汚い」という意味ではないと思います。コードは汚くても動きます。
先輩はこれでは「仕様を満たしていないから改善しろ」と言った可能性もあります、これもやはり先輩に確認すべきです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/07/31 18:25

    わかりました。先輩に確認して、何を意図した発言であったのかを理解して考えます。
    ありがとうございます。

    キャンセル

+2

その先輩が、具体的にどの部分が汚いと言ってきたのかがわかりませんが、
コーディングルールは会社などのグループや、個人によって違うので、
何がどう汚いのか?などを指示するのは難しいです。

ただ、私が思うに、失礼ながら質問者さんはまだjavaの基礎知識自体が不足しているようなので、
このあたりのHPか
Java セキュアコーディングスタンダード
Javaコーディング標準

このあたり書籍などを参考にしましょう。
Javaルールブック ~読みやすく効率的なコードの原則

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/07/31 13:59

    ありがとうございます。勉強します!!

    キャンセル

+1

限られた時間内で成果を出さないといけないのでなかなか難しいとは思いますが、
逆に完璧、美しいと言われるようなコードがどんなコードを想像してみましょう。
それに近づけるためにすぐ出来ることをやってみてはいかがでしょうか。
汚いかどうかは別として、綺麗とは言えない というような意味合いで考えてみてはいかがでしょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/07/31 14:44

    わかりました。ありがとうございます!!

    キャンセル

0

基本的に、その組織のコーディングルールに従って書くべきで、何をもってきれいか汚いかというのは外部から指摘しにくいかと思います。
ただ、あえて言えば、定数は定義してそれを代入なり計算なりに使ったほうが良いかと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/07/31 15:32

    わかりました。定数の定義を使用するようにします。
    ありがとうございます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.10%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る