2017-01-12 2 views
0

Мне нужно найти местоположение пользователя на разных экранах моего приложения. Я написал код, чтобы получить местоположение в одном из действий экрана, однако теперь я хочу получить местоположение в другой активности экрана. Есть ли что-нибудь, что я могу сделать, чтобы избежать повторного написания того же кода?Как избежать повторения кода в Android через классы?

 // variables 
     // These variables will be repeated 
     LocationProvider locationProvider; 
     double latitude; 
     double longitude; 
     private String userPostcode; 
     // =============== 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
             Bundle savedInstanceState) { 

     // This code will be repeated 
     locationProvider = new LocationProvider(getActivity()); 
     latitude = locationProvider.getLatitude(); 
     longitude = locationProvider.getLongitude(); 
     if (isNetworkAvailable(getContext())) { 
      getPostcode(); 
     } else { 
      Toast.makeText(getActivity(), "Internet or GPS is not available. To get the best location one or both of these must be on", 
        Toast.LENGTH_LONG).show(); 
     } 
// ============= 
     return inflater.inflate(R.layout.fragment_location, container, false); 
    } 




     // These two methods will be repeated 
     private void getPostcode(){ 
        Geocoder geoCoder = new Geocoder(getActivity().getApplicationContext(), Locale.getDefault()); 
        List<Address> address = null; 

        if (geoCoder != null) { 
         try { 
          address = geoCoder.getFromLocation(latitude, longitude, 1); 
         } catch (IOException e1) { 
          e1.printStackTrace(); 
         } 
         if (address.size() > 0) { 
          userPostcode = address.get(0).getPostalCode(); 
         } 
        } 
       } 


      private boolean isNetworkAvailable(final Context context) { 
        final ConnectivityManager connectivityManager = ((ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE)); 
        return connectivityManager.getActiveNetworkInfo() != null && connectivityManager.getActiveNetworkInfo().isConnected(); 
       } 
    // ==================== 

Если его можно избежать повторения, пожалуйста, кто-нибудь может показать мне/показать мне, как это можно сделать, пожалуйста. Я новичок в андроиде и, возможно, пропустил что-то глупое.

ответ

1

Добавить getPostcode() в отдельном классе. Вы можете изменить его, как следует.

public class Utils { 


    public static String getPostcode(Context context, double lat, double lng){ 
     Geocoder geoCoder = new Geocoder(context, Locale.getDefault()); 
     List<Address> address = null; 

     if (geoCoder != null) { 
      try { 
       address = geoCoder.getFromLocation(lat, lng, 1); 
      } catch (IOException e1) { 
       e1.printStackTrace(); 
      } 
      if (address.size() > 0) { 
       return address.get(0).getPostalCode(); 
      } 
     } 
     return null; 
    } 


    public static boolean isNetworkAvailable(final Context context) { 
     final ConnectivityManager connectivityManager = ((ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE)); 
     return connectivityManager.getActiveNetworkInfo() != null && connectivityManager.getActiveNetworkInfo().isConnected(); 
    } 
} 

в вашем фрагменте/активности делают этот

if(Utils.isNetworkAvailable(this)) { 
      String postCode = Utils.getPostcode(this, yourLat, yourLng); 
     } 

Смените this в getActivity(), если в фрагменте.

+0

Возможно ли вернуть более одного результата, а затем принять решение позже при вызове метода, который будет использоваться. например, я хочу вернуть lat и long также – SumOne

+0

Также, как я могу назвать это в своем фрагменте? – SumOne

+0

см. Отредактированный пост. для фрагмента вам нужно использовать 'getActivity()', и для вызова в действии вы можете просто передать 'this' в качестве контекста. –

0

Да, рефрактор в отдельный класс. Или найдите способ получить данные от одной активности к другой. (putExtra(), Singleton, DataBase, SharedPreferences и т. д.)

1

Методы, которые просто возвращают некоторое значение, вам необходимо повторно использовать их часто и не привязывать к каким-либо объектам или состояниям, вы можете сделать их статическими.

Создайте класс полезности. Например

public class Utils { 

    public static boolean isNetworkAvailable(final Context context) { 
     final ConnectivityManager connectivityManager = ((ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE)); 
     return connectivityManager.getActiveNetworkInfo() != null && connectivityManager.getActiveNetworkInfo().isConnected(); 
    } 

    public static String getPostCode(Activity activity) { 
     ... 
    } 
} 

Тогда вы можете использовать его в любом месте, где захотите.

boolean isNetworkAvailable = Utils.isNetworkAvailable(context); 
+0

Как насчет переменных, которые я использую в методе getPostcode? – SumOne

+0

вместо вызова getPostcode() вы вызове userPostCode = Utils.getPostcode (this); если вам нужно установить несколько значений в один вызов, я предлагаю вам следовать основным принципам oop и создавать объект, представляющий ваши данные. В случае с String postCode, List

и т. Д. –

+0

Входит ли это в оператор If, который у меня есть, если у пользователя есть интернет? if (isNetworkAvailable (getContext())) { – SumOne

1

Создайте новый файл класса и поместить их ниже функции в этом файле класс

private String getPostcode(Activity activity, Double latitude, Double longitude) { 
     String userPostcode = null; 
     Geocoder geoCoder = new Geocoder(activity.getApplicationContext(), Locale.getDefault()); 
     List<Address> address = null; 

     if (geoCoder != null) { 
      try { 
       address = geoCoder.getFromLocation(latitude, longitude, 1); 
      } catch (IOException e1) { 
       e1.printStackTrace(); 
      } 
      if (address.size() > 0) { 
       userPostcode = address.get(0).getPostalCode(); 
      } 
     } 
     return userPostcode; 
    } 

    private static boolean isNetworkAvailable(final Context context) { 
     final ConnectivityManager connectivityManager = ((ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE)); 
     return connectivityManager.getActiveNetworkInfo() != null && connectivityManager.getActiveNetworkInfo().isConnected(); 
    } 

Для доступа к ним функции создания объекта этого класса и вызвать этот fucntion

1

Вы можете создать утилиту класс, который выполняет всю необходимую работу. Передайте объект activity/context в качестве параметра конструктора в класс утилиты. Затем используйте методы класса, чтобы получить то, что вы хотите. Посмотрите на следующий код для полезного класса:

public class LocationHelper { 
    private double mLatitude; 
    private double mLongitude; 
    private Context mContext; 
    private LocationProvider mLocationProvider; 

    // Dont know if you need Activity or Context object. 
    // Pass whatever as per requirement 
    public LocationHelper(Context context) { 
     this.mContext = context; 
     initLocation(); 
    } 

    // Set the latitude and longitude here. 
    // You can get the latitude and longitude using 
    // getter methods. 
    private void initLocation() { 
     mLocationProvider = new LocationProvider(mContext); 
     mLatitude = mLocationProvider.getLatitude(); 
     mLongitude = mLocationProvider.getLongitude(); 
    } 

    public double getLatitude() { 
     return mLatitude; 
    } 

    public double getLongitude() { 
     return mLongitude; 
    } 

    // Get the post code as a string. Empty if failed to get any. 
    public String getPostcode(){ 
     String userPostcode = ""; 
     Geocoder geoCoder = new Geocoder(mContext, Locale.getDefault()); 
     List<Address> address = null; 

     //It is a redundant check since it will always be true 
     if (geoCoder != null) { 
      try { 
       address = geoCoder.getFromLocation(mLatitude, mLongitude, 1); 
      } catch (IOException e1) { 
       e1.printStackTrace(); 
      } 
      // Also make sure to put a null check to avoid NullPointerException 
      if (address != null && address.size() > 0) { 
       userPostcode = address.get(0).getPostalCode(); 
      } 
     } 
     return userPostcode; 
    } 

    //To check if device is offline/online. 
    public boolean isNetworkAvailable() { 
     final ConnectivityManager connectivityManager = ((ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE)); 
     return connectivityManager.getActiveNetworkInfo() != null && connectivityManager.getActiveNetworkInfo().isConnected(); 
    } 
} 
+0

- метод sNetworkAvailable(), используемый в этом классе? или мне нужно вызвать его в фрагменте, где я буду использовать getpost? – SumOne

+0

Эта реализация требует, чтобы вы вызывали ее во фрагменте. Если вы хотите просто вызвать один метод, который проверяет сеть и возвращает postCode, вы можете написать метод-оболочку в классе LocationHelper. –

Смежные вопросы