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

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

新規登録して質問してみよう
ただいま回答率
85.46%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

1回答

3277閲覧

MainScope()によりCoroutineScopeを実装する際の記述方法について

tokumei000

総合スコア17

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

1クリップ

投稿2020/05/09 04:38

Androidアプリ開発において、coroutineによる非同期処理について勉強しています。
CoroutineScopeを実装する際にMainScope()を用いると容易に実装できることがわかったのですが、記述方法に関して疑問があったので質問させていただきました。

リファレンスを見るとMainScope、CoroutineScope両方のページにMainScopeによる実装例が載っていまいした。
MainScopeのページではActivityのプロパティとして宣言しており、CoroutineScopeのページではActivityに実装しClass Delegationにより生成しています。(言い方で何か間違っていたらすいません)

これらにはどのような違いがあるのでしょうか?(内部的にそもそも同じものなのか、書き方の違いでどのような利点があるのか等)

scope.cancelではなくcancelのように済ませられるのでコード量が少し減るということくらいはわかるのですが...

よろしくお願いします。

MainScope

kotlin

1class MyAndroidActivity { 2 private val scope = MainScope() 3 4 override fun onDestroy() { 5 super.onDestroy() 6 scope.cancel() 7 } 8}

CoroutineScope

kotlin

1class MyActivity : AppCompatActivity(), CoroutineScope by MainScope() { 2 override fun onDestroy() { 3 cancel() 4 } 5 6 fun showSomeData() = launch { 7 draw(data) 8 } 9 }

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

coroutinesというよりはclass delegationについてのご質問ですね。

scope.cancelではなくcancelのように済ませられるのでコード量が少し減るということくらいはわかるのですが...

ご推測の通りで、delegate元のクラス(MyActivity)が元々持っているメソッドのようにlaunchやcancelを呼べるというくらいしか違いは無いと思います。どちらも挙動に差はありません。

追記

念のため、class delegationの方のサンプルをbytecodeにしてJavaコードにdecomplileしてみました。
MsinScope()の返り値をメンバーとして宣言して呼び出しているだけなので、両サンプルの挙動に差がないことが分かると思います。

java

1public final class MyActivity extends AppCompatActivity implements CoroutineScope { 2 private final CoroutineScope $$delegate_0 = CoroutineScopeKt.MainScope(); 3 4 protected void onDestroy() { 5 CoroutineScopeKt.cancel$default(this, (CancellationException)null, 1, (Object)null); 6 } 7 8 @NotNull 9 public final Job showSomeData() { 10 return BuildersKt.launch$default(...); // 長いので省略 11 } 12 13 @NotNull 14 public CoroutineContext getCoroutineContext() { 15 return this.$$delegate_0.getCoroutineContext(); 16 } 17}

ちなみに、最近のAndroidXではLifecycleScopeやViewModelScopeといった機能も用意されていて、MainScopeよりこちらの方が便利です。これらはonDestroyやonClearedのタイミングで自動的にcancelが呼ばれるので、呼び忘れを防ぐことができます。詳しくはドキュメントをどうぞ。

投稿2020/05/09 15:13

編集2020/05/09 22:03
kakajika

総合スコア3131

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tokumei000

2020/05/10 00:52

両者に大きな違いは無いのですね。デコンパイルして確認までしていただいてありがとうございます。 LifecycleScopeやViewModelScopeについても確認しておきます。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問