2016-04-06 17 views
0

私は、ボタンクリックで現在起動している非同期タスク(P、Q、R)を使用してデータをWebサービスにアップロードするAndroidアプリケーションを用意しています。私は3つのテーブル(A、B、C)のデータを持っています。現在、最初の非同期タスク(P)のdoInBackgroundにテーブルAデータをアップロードし、最初の非同期タスク(P)のonPostExecuteで2番目の非同期タスク(Q)を呼び出します。onPostExecuteでは、返されたデータでローカルテーブルを更新し、同じように。その機能はすでに存在していますが、アプリケーションが終了しても一定の時間間隔(30分ごと)でデータをアップロードしたいと考えています。デバイスが起動している/アプリケーションの更新/アプリケーションをインストールするとき、このプロセスを開始する必要があります。データをアップロードしている間、ユーザーがアプリケーションを開くと、アップロードボタンは無効にする必要があります。 1.非同期タスクではなくサービスを使用する必要がありますか? と私にこれに関するアドバイスをください。アップロードデータに一定時間間隔でAndroidデータをアップロード

+0

Webサービスをラップで走るようアプリは、また閉じているときに動作しますあなたの 'Service'クラスで30分遅れてタイマータスクを実行してください... – Mohit

答えて

1

私はあなたがむしろ私はあなたが非常に簡単かつ非常にあるボレーや改造へ移行すべきだと思うAsynctasksよりも、アンドロイドにかなり新しいものだと思う従っ

のようにしてください。 Asynctask

と比較して高速な私の代わりに、非同期タスク

サービスを使用する必要がありますか

30分ごとにデータをアップロードする必要があるので、データをアップロードするサービスにコードを移動することをおすすめします。サービスはを使用しているので、また、それがバックグラウンド

+0

デバイスの起動時にサービスを開始する必要があります。app.Iを更新してUIを更新します(アップロード中にアップロードボタンを無効にしますいくつかのトーストメッセージ)、私はonPostExecuteで2番目の非同期タスクを呼び出します。それを達成する方法?私はAlarmManagerを使用する必要がありますか? – user2708104

+0

ブート時にサービスを開始するオプションがありますが、タイマーもありません。両方とも同じ目的を果たします。 –

1

あなたのレシーバークラス

import java.util.Timer; 
import java.util.TimerTask; 


import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 

public class yourReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(final Context context, Intent intent) { 
     int delay = 5000; // delay for 5 sec.5000 
     int period = 60000; // repeat every 1min.60000 

      Timer timer = new Timer(); 
      timer.scheduleAtFixedRate(new TimerTask() { 
      public void run() { 
      Intent serviceIntent = new Intent(context,UploadService.class); 
      context.startService(serviceIntent); 
      } 
     }, delay, period); 

    } 
} 

あなたのサービスクラス

import android.app.Service; 
import android.content.Intent; 
import android.media.MediaPlayer; 
import android.os.IBinder; 
import android.widget.Toast; 
public class UploadService extends Service { 
MediaPlayer myPlayer; 
@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 
@Override 
public void onCreate() { 
    Toast.makeText(this, "Service Created", Toast.LENGTH_LONG).show(); 

    myPlayer = MediaPlayer.create(this, R.raw.sun); 
    myPlayer.setLooping(false); // Set looping 
} 
@Override 
public void onStart(Intent intent, int startid) { 
    Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show(); 
    serviceThread = new ServiceThread(); 
    serviceThread.start(); 
} 
@Override 
public void onDestroy() { 
    Toast.makeText(this, "Service Stopped", Toast.LENGTH_LONG).show(); 
    myPlayer.stop(); 
} 

    private class ServiceThread extends Thread { 
    @Override 
    public void run() { 
     synchronized(UploadService.class){ 
      if(uploadStatus) { 
       uploadStatus = false; 
       uploadData(); 
       uploadStatus =true; 
      } 
     } 


    } 
} 
} 
+0

ありがとうございます。サービスを使用して非同期タスクのonPostExecuteを達成する方法私は3つの非同期タスクを持っています。 2番目のタスクは1番目のタスクonPostExecuteから呼び出しています。 – user2708104

関連する問題