0

3つのアクティビティで構成されるアプリケーションがあります。最初のアクティビティでは、onCreate()でスレッドを開始し、onDestroy()で停止するので、アプリケーションの実行中にこのスレッドが機能することを願っています。このスレッドでは、データベースからデータを読み取り、サーバーに送信します。

主な質問:この作業を行う正しい方法はありますか、またはアプリケーションの動作中に最初のアクティビティが破棄される可能性がありますか?正しい方法でそれを行う方法は?

副次的な質問:データベースへのマルチ書き込みの問題のため、SQLiteの書き込みを管理し、すべてのアクティビティからアクセスできるクラスを作成する方法はありますか?

Applicationクラスの使用を考えていますが、疑問があります。

4

4 に答える 4

1

サーバーへのデータ送信は通常、連続操作ではなく繰り返し可能なジョブ型の操作なのでIntentService、スレッドの代わりに使用する方が良さそうです。また、アプリケーションがバックグラウンドにある場合でもスレッドが実行されるため、設定onCreateと破棄onDestroyは最善の方法ではありません (通常は役に立たないことを意味します)。アプリケーションの拡張はまったく問題ありませんが、そこまでする必要はないと思います。

于 2012-09-28T09:54:18.153 に答える
0
  • 最初の質問ではIntentService、サーバーとの通信に使用します。
  • 2 番目の質問では、クラスを拡張しSQLiteOpenHelperてシングルトンにします。それでおしまい。
于 2012-09-30T13:57:03.793 に答える
0

アプリケーションの残りの部分がアクティブであっても、アクティビティが不要になったときに破棄されないことに依存することはできません。ただし、すべてのアクティビティでスレッドを開始/停止できるようにし、アプリケーションのグローバル参照カウンターを使用して、いつスレッドを再開するか、参照カウントを増やすかを知ることができる場合があります。

データベース管理クラスに関しては、クラスのインスタンスを複数持つことは問題ありません。管理している SQLite データベースはスレッドセーフです。ヘルパーのインスタンスを 1 つだけ持つ必要があるその他の理由がある場合は、最初にアクセスしたクライアントがインスタンスを作成し、後続のすべてのクライアントがそのポインターを取得するように、Singleton パターンを使用して作成できます。

于 2012-09-28T09:56:24.243 に答える
0

Application クラスは、アプリケーションのグローバルな要素を管理するために使用できます。常にスレッドを実行することが良い考えである場合は、別の問題です。

  1. android.app.Application サブクラスを実装します。アプリケーション パッケージのルートにある必要があります。

    package com.yourapp;        
    
    public class YourApplication extends Application {
        @Override
        public void onCreate() {
            // [...]
        }
        // [...]
    }
    
  2. AndroidManifest でアプリケーション クラスを指定します。

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
              package="com.yourapp"
              android:versionName="1.0"
              android:versionCode="1.0">
        <application android:name="YourApplication"
                     android:label="@string/app_name"
                     android:icon="@drawable/icon">
        <!-- ... -->
        </application>
    </manifest>
    
于 2012-09-28T10:38:52.933 に答える