![](https://habrastorage.org/getpro/habr/post_images/ffa/54e/0b8/ffa54e0b8d3c6bf535da84516987b7af.png)
そして今、最近、私はついにこの問題についていくつかの自由時間を見つけました( 著者のメモ:ここであなたは私のためだけに幸せになれます )! 今何が流行しているか、何年も前に流行になったものについてのさまざまな記事を読んだ後、私は自分の友人が何を構成するかのおおよそのリストを自分で編集しました。 ここに彼がこれまでに私から学んだことを示します。
- 行きましょう! 彼はインターネットに行き、そこからデータを取得し、自分自身に持ち込みます
- 覚えて! 必要に応じて、彼は彼がインターネットで何をしたかを覚えているでしょう、多分最初にこのデータを処理する
- そして一般的に-同時にいくつかのタスクを実行します! さらに、モンスターが突然、たとえばタンブルすることを決めたという事実を気にしないでください。
FunLibという名前の怪物が生き返るように、 いくつもの要素を1つの山に積み上げなければなりませんでした! ここでは、レトロフィット、イベントバス、ジョブキューなどの星を集めました...しかし、順番に取りましょう! だから、誰が私の頭の中で何に責任がありますか:
インターネットサーフィン
Retrofit + OkHttpを使用してオンラインにします。 これにより、大規模なコミュニティの支援を受けて、すべての作業を迅速かつ正確に行うことができます。 同意して、おおよそこの方法でサービスのリクエストをすることは非常に便利です:
public interface GithubApi { @GET("/search/repositories?sort=stars&order=desc") SearchResult search(@Query("q") String query); }
そして、伝道者のように、それはなんとクールな結果になるのでしょう! 実際、開発は実際には実装レベルではなく、文字通りインターフェイスレベルで実行されます! 一般に、さまざまな方法で要求を構成するために、多くのものを要求に追加できます。 しかし、以来 これは記事の本質ではありません。独立した研究のために残しておきます。 まあ、または、誰かがこれらのライブラリをどれだけクールに使用しているか、特に彼の動きが些細ではなく隠されていない場合は素晴らしいでしょう。 ガイド 。
データベース内のメモリ
ORMLiteはそのメモリを担当します 。 彼らが言うように、すべてのマーカーの味と色は異なります。 このソリューションが最も気に入っています。 特に、このライブラリの利点について、私はこれを次のように考えています。
- 生データセットではなく、データベースから既製のオブジェクトを取得できます(セカンダリキーのデータがある場合でも)
- ORMリクエストを実行してカーソルを取得できます
- すべての付随機能を備えた通常のSQLクエリを実行することで、カーソルを取得できます。
- そのような決定は、将来あなたのコードに同行/読む人なら誰でも簡単に理解できるでしょう
ここでは、いつものように、必要なクラスとフィールドにそれぞれ
@DatabaseTable
と
@DatabaseField
として注釈を付けます。 その後、データベース内のデータを落ち着いて追加、または必要に応じて取得できます。
private void saveRepositories(List<Repository> repositories) throws SQLException { Dao<User, ?> userDao = getDbHelper().getDao(User.class); Dao<Repository, ?> repositoryDao = getDbHelper().getDao(Repository.class); for (Repository repository : repositories) { userDao.createOrUpdate(repository.getOwner()); repositoryDao.createOrUpdate(repository); } }
PS:残念ながら、FunLibはURIを使用してローダーに便利に通知することはできませんが...はい、そのフラグメントを使用したアクティビティは、ローダーを使用した便利な作業のための機能を提供しませんが、すべてが手元にあります ! プルリクエストがあなたを待っています。 さて、または私がこれを行う間待つ:P
並行作業の頭脳
この重要なプロセスでは、 Priority Job Queueというツールが選択されました。 なぜ私たちは独自のサービスを作らなかったのですか? はい、すべてがシンプルです-このライブラリの使用に興味がありました=)はい、マニフェストはクリーンなままです。 そして、これはあまり重要ではありませんが、この解決策は中枢神経系に
FunJob
という名前で作成されました。これは、
public abstract T doJob() throws Throwable
必要な作業を実行するだけです。
仕事の一例。 注意! モンスターは危険です! 必死の向こう見ずだけを見てください!
public class SearchJob extends FunJob<List<Repository>> { private String mQuery; public SearchJob(int id, String query) { super(id); mQuery = query; } @Override public List<Repository> doJob() throws Throwable { SearchResult searchResult = ((GithubApi) getApi()).search(mQuery); List<Repository> repositories = searchResult.getRepositories(); return repositories; } }
中枢神経系または単にDI
データベース、インターネット、および脳への、そしてロボットの身体へのその他の情報の配信などの重要なタスクのために、 Dependency Injectorを実装するDaggerと呼ばれるコンポーネントが使用されました。 幸いなことに、Jobを実行する準備ができたら、私たちの脳はJobを投入できます! したがって、FunJobは、ジョブを実行するときに、データベース、APIに自信を持ってアクセスでき、それが一般的であることを知っています。 結局、脳と体をつなぐことがとても重要です!
そして、チームを脳から身体に送るために、 EvenBusと呼ばれるものが使用されました。 当初はOttoを使用したかったのですが、何らかの理由でFunLibが嫌いだったため、すぐにそれを放棄しました。 まあ、何もありません-EventBusはそのタスクにも対応しています! 体は常に正しいコマンドを時間通りに受け取ります!
レディーステディゴー!
これで、私は停止することに決めたが、私の話を完了し、あなたからの後退を得る。 そしてその後、私はパン粉をさらに開発し続けます。
この例では、FunLibの動作を制御する方法を明確に見ることができます。必要なものは次のとおりです。
- FunAppを継承し、その中にAPIへのパス、APIで動作するインターフェイス、およびDbHelperクラスを記述します
- FunActivity / FunFragmentから継承されており、作業を開始してAPIとデータベースにアクセスするのが既に便利です
- 必要なことをしてください! ;)
追記
おそらく、ローダーについて読んだ後、あなたはついにContentProviderアプリケーションにねじ込むことに決めたと思うでしょう。 しかし、いいえ、私はこれをするつもりはありません、なぜなら 死傷者はいないと思います。 ガイドには 、他のアプリケーションとデータを共有するつもりがない場合、独自のプロバイダーを開発する必要はありません。 私の練習では、他のアプリケーションにデータを提供するようなアプリケーションをまだ作成する必要はありませんでした。 このせいでトマトが私に投げられることはありません! 私たちは皆、さまざまなタスクに遭遇します。
FunJobのどのIDが設定されているかを個別に監視する必要があることも悲しいです。 しかし、何もありません-それは修正され、別のおいしいお菓子になります!
リポジトリへのリンクを見逃した人、キャッチ: https : //github.com/senneco/FunLib
コメントとプルリクエストで会いましょう:D