我有一个Android应用程序,它使用当前按钮点击启动的异步任务(P,Q,R)将数据上传到Web服务。我有三个表(A,B,C)的数据。目前我在第一个异步任务(P)的doInBackground中上传表A数据,我在第一个异步任务(P)的onPostExecute中调用第二个异步任务(Q)。在onPostExecute中,我用返回的数据更新我的本地表并给出一些UI消息同样。虽然该功能已存在,但现在我想以固定的时间间隔(每30分钟)上传数据,即使应用程序已关闭。当设备启动/安装应用程序/更新应用程序时,应启动此过程。在上传数据时,如果用户打开应用程序,则应禁用上载按钮。我不一定需要长时间运行的长时间运行任务。 1.我是否需要使用服务而不是异步任务? 并就此提出建议。
答案 0 :(得分:1)
要上传数据,请执行以下操作
我认为你对Android很新,而不是 Asynctasks我认为你应该转向凌空或改造,与Asynctask相比,这非常容易和非常快
我是否需要使用服务而不是异步任务
由于您需要每30分钟上传一次数据,我建议您将代码移至要上传数据的服务。此外,由于服务使用,当应用程序关闭时它也会起作用,因为它在后台运行
答案 1 :(得分:0)
您的Receiver类
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;
}
}
}
}
}