-

   rss_rss_hh_new

 - e-mail

 

 -

 LiveInternet.ru:
: 17.03.2011
:
:
: 51

:


[ ] Android-

, 01 2017 . 15:14 +

. Google I/O Google Android-, . . , .


: -, .


Lifecycle

. , . , MVP/MVVP . .


. android.arch.lifecycle, Lifecycle, LifecycleActivity LifecycleFragment. , , , Lifecycle LifecycleOwner:


public interface LifecycleOwner {
   Lifecycle getLifecycle();
}

- API , LifecycleActivity LifecycleFragment. LifecycleOwner Fragment AppCompatActivity, LifecycleActivity LifecycleFragment .


Lifecycle LifecycleObserver . :


class MyLocationListener implements LifecycleObserver {
  private boolean enabled = false;
    private final Lifecycle lifecycle;
  public MyLocationListener(Context context, Lifecycle lifecycle, Callback callback) {
       this.lifecycle = lifecycle;
       this.lifecycle.addObserver(this);
       // - 
  }

  @OnLifecycleEvent(Lifecycle.Event.ON_START)
  void start() {
    if (enabled) {
     //    
    }
  }

  public void enable() {
    enabled = true;
    if (lifecycle.getState().isAtLeast(STARTED)) {
      //    ,
            //    
    }
  }

  @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
  void stop() {
    //    
  }
}

MyLocationListener :


class MyActivity extends LifecycleActivity {

    private MyLocationListener locationListener;

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

        locationListener = new MyLocationListener(this, this.getLifecycle(), location -> {
         //  , ,   
        });
        // -    
        Util.checkUserStatus(result -> {
            if (result) {
                locationListener.enable();
            }
        });
    }
}

LiveData

LiveData Observable rxJava, Lifecycle. LiveData , .


LiveData:


setValue() ;
onActive() ;
onInactive() .


, LiveData , .


, Lifecycle STARTED RESUMED. LiveData , .


LiveData UI-:


public class LocationLiveData extends LiveData {
  private LocationManager locationManager;

  private SimpleLocationListener listener = new SimpleLocationListener() {
    @Override
    public void onLocationChanged(Location location) {
      setValue(location);
    }
  };

  public LocationLiveData(Context context) {
    locationManager = (LocationManager) context.getSystemService(
        Context.LOCATION_SERVICE);
  }

  @Override
  protected void onActive() {
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, listener);
  }

  @Override
  protected void onInactive() {
    locationManager.removeUpdates(listener);
  }
}

:


public final class App extends Application {

    private static LiveData locationLiveData = new LocationLiveData();

    public static LiveData getLocationLiveData() {
        return locationLiveData;
    }
}

, , :


public class Activity1 extends LifecycleActivity {

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

        getApplication().getLocationLiveData().observe(this, (location) -> {
          // do something
        })
    }
}

public class Activity2 extends LifecycleActivity {

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

        getApplication().getLocationLiveData().observe(this, (location) -> {
          // do something
        })
    }
}

, observe LifecycleOwner, .


DESTROYED .


: , .


ViewModel

ViewModel UI, UI, , (, MVVM ). :


public class MyActivityViewModel extends ViewModel {

    private final MutableLiveData valueLiveData = new MutableLiveData<>();

    public LiveData getValueLiveData() {
        return valueLiveData;
    }
}

public class MyActivity extends LifecycleActivity {

    MyActivityViewModel viewModel;

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

        viewModel = ViewModelProviders.of(this).get(MyActivityViewModel.class);
        viewModel.getValueLiveData().observe(this, (value) -> {
            //    
        });
    }
}

of (scope) . of , . , .


scope , - . :


  1. ;
  2. ;
  3. .

ViewModel. . .


, , onCleared .


: ViewModel , , .


Room Persistence Library

. SQLite. API , , . SQL- , .


Google ORM- SQL- .


: Entity, DAO Database.


Entity :


@Entity(tableName = users)
public class User() {

    @PrimaryKey
    public int userId;

    public String userName;
}

DAO (Data Access Object) , :


@Dao
public interface UserDAO {

    @Insert(onConflict = REPLACE)
    public void insertUser(User user);

    @Insert(onConflict = REPLACE)
    public void insertUsers(User users);

    @Delete
    public void deleteUsers(User users);

    @Query(SELECT * FROM users)
    public LiveData> getAllUsers();

    @Query(SELECT * FROM users WHERE userId = :userId LIMIT 1)
    LiveData load(int userId);

    @Query(SELECT userName FROM users WHERE userId = :userId LIMIT 1)
    LiveData loadUserName(int userId);
}

, DAO , . .


, , , Query , .


Query , , . , Entity - , , (lazy) UI-. Google .


, , LiveData, , . . .


, Google , , .


, :


@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
    public abstract UserDAO userDao();
}

, , .


Application- Dagger- :


AppDatabase database = Room.databaseBuilder(context, AppDatabase.class, "data").build();

DAO :


database.userDao().insertUser(new User());

DAO / SQL- , . Migration:


AppDatabase database = Room.databaseBuilder(context, AppDatabase.class, "data")
     .addMigration(MIGRATION_1_2)
     .addMigration(MIGRATION_2_3)
     .build();

static Migration MIGRATION_1_2 = new Migration(1, 2) {
    @Override
    public void migrate(SupportSQLDatabase database) {
        database.execSQL();
    }
}

static Migration MIGRATION_2_3 = new Migration(2, 3) {
   
}

AppDatabase .


, SQL- , , - .


, Entity, Exception .


: , .


. , , . , > 1 Migration, Entity Migration .
, Migration , . . , .



. , Google clean architecture, , .
image
, .


Model Remote Data Source . Repository . Repository , Repository . , ViewModel Repository , UI.


LiveData.



. . . OpenWeatherMap.


: (CityListFragment) (CityFragment). MainActivity.


MainActivityViewModel.


MainActivityViewModel WeatherRepository.


WeatherRepository . , .


API key WeatherRepository. OpenWeatherMap.


GitHub.


, -. , .


. !

Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/329990/

:  

: [1] []
 

:
: 

: ( )

:

  URL