1

データを取得してリモートサーバーにデータを挿入するバックグラウンドサービスを使用しています。OK、アプリの速度を落とさずにバックグラウンドで実行したかったので、バックグラウンドサービスに配置しましたが、アプリの速度が低下しています。

コードでわかるように、60秒のスリープがあり、私のアプリは60秒ごとに2/3秒フリーズしています。これはこのコードです、確かですが、解決方法がわかりません。

public class MyService extends Service implements Runnable{
    boolean serviceStopped;
    RemoteConnection con; //conexion remota
    List <Position> positions;
static SharedPreferences settings;
static SharedPreferences.Editor configEditor;
    private Handler mHandler;
    private Runnable updateRunnable = new Runnable() {
        @Override public void run() {
            //contenido
            if (serviceStopped==false)
            {
                positions=con.RetrievePositions(settings.getString("login","")); //traigo todas las posiciones
                if (positions.size()>=10) //si hay 10 borro la mas vieja
                    con.deletePosition(positions.get(0).getIdposition());
                if (settings.getString("mylatitude", null)!=null && settings.getString("mylongitude", null)!=null)
                    con.insertPosition(settings.getString("mylatitude", null),settings.getString("mylongitude", null), formatDate(new Date()), settings.getString("login",""));
            }
            queueRunnable();//duerme
        }
    };
    private void queueRunnable() {
        //mHandler.postDelayed(updateRunnable, 60000); //envia una posicion al servidor cada minuto (60.000 milisegundos es un minuto)
        mHandler.postDelayed(updateRunnable, 60000);
    }

    public void onCreate() {
        serviceStopped=false;
settings = PreferenceManager.getDefaultSharedPreferences(this.getApplicationContext());
        configEditor = settings.edit();
        positions=new ArrayList<Position>();
        con = new RemoteConnection();
            mHandler = new Handler();
            queueRunnable();
        }
4

1 に答える 1

2

サービスを作成したとしても、それが別のスレッドで実行されるという意味ではありません。ご覧くださいhttp://developer.android.com/reference/android/app/Service.html

他のアプリケーションオブジェクトと同様に、サービスはホスティングプロセスのメインスレッドで実行されることに注意してください。つまり、サービスがCPUを集中的に使用する操作(MP3再生など)またはブロック操作(ネットワークなど)を実行する場合は、その作業を実行するための独自のスレッドを生成する必要があります。これに関する詳細は、プロセスとスレッドにあります。IntentServiceクラスは、実行する作業をスケジュールする独自のスレッドを持つServiceの標準実装として使用できます。

Androidでサービスが実際にどのように機能するかをお読みくださいhttp://developer.android.com/guide/topics/fundamentals/services.html

したがって、IntentServiceスケジュールされたアラートはここで解決策になる可能性があります。

于 2011-06-02T09:12:43.060 に答える