我有一个Android服务,在onStart方法中我从Intent活动中获取了许多字符串,然后执行AsynTask从Internet下载文件。
当活动正在运行时,这可以正常工作,但是当我停止活动时,这会重新启动onStart方法,但是obiusly意图为null,导致我返回nullPointerException。
我可以做什么服务不要在onStart上输入,并继续第一个asyntask来下载所有文件?
这是我的代码
@Override
public void onStart(Intent intent, int startId) {
desde = intent.getIntExtra("desde", 0);
hasta = intent.getIntExtra("hasta", 1);
email = intent.getStringExtra("email");
password = intent.getStringExtra("password");
new DescargaFotos().execute();
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
和Inicio.java(UI活动)
Intent iService = new Intent(contexto,
ServiceDownloader.class);
iService.putExtra("desde", 0);
iService.putExtra("hasta", 5);
iService.putExtra("email", email);
iService.putExtra("password", password);
startService(iService);
修改
新问题:
我正在使用IntentService,我绑定了这样的服务:
Intent iService = new Intent(contexto,
ServiceDownloader.class);
ServiceConnection serviceConector = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
Log.i("INFO", "Service bound ");
}
@Override
public void onServiceConnected(ComponentName name,
IBinder service) {
Log.i("INFO", "Service Unbound ");
}
};
iService.putExtra("desde", 0);
iService.putExtra("hasta", 50);
iService.putExtra("email", email);
iService.putExtra("password", password);
startService(iService);
bindService(iService, serviceConector,
Context.BIND_AUTO_CREATE);
现在我的问题是,在我的Galaxy nexus中,如果我进入app运行时列表,并销毁我的应用程序,服务停止,并停止下载,停止发送通知等?我该如何绑定服务来解决这个问题?
答案 0 :(得分:2)
使用IntentService。 IntentService专门设计用于执行您想要的操作。您不必实现onStart,onStartCommand等。该工作在后台线程上运行。一旦工作完成,线程就会被破坏。
无论活动的状态如何,IntentService都将继续运行。
您可能遇到的一个问题是您在“活动”中的错误位置发送了您的意图,或者您没有检查操作是否完整。在发送Intent之前,请检查SharedPreferences中的标志(如果该标志不存在,则表示您是第一次启动)。发送Intent时,在SharedPreferences中存储一个标志以指示您发送了它。当您的IntentService收到Intent时,让它更新标志以表明它已收到它。在IntentService完成之前,让它再次更新标志。等等。
答案 1 :(得分:1)
我没有评论你的问题的声誉,所以我会写一个答案:)
首先,在我看来,如果您的服务只是这样做,从互联网上获取一些字符串和下载文件,您就不需要该服务。 AsyncTaks足以解决您的问题,并且实现起来更简单。这样做可以避免意图问题。
AsyncTask可以正确,轻松地使用UI线程。该类允许执行后台操作并在UI线程上发布结果,而无需操纵线程和/或处理程序。
但是,如果您决定继续使用某项服务,那么我就知道您的活动中何时调用了startService。
如果您对何时使用AsyncTask,Service,IntentService和Thread有疑问, link 可以为您提供帮助。
答案 2 :(得分:0)
这是我的建议......
在服务中使用线程而不是AsyncTask,因为AsynTask应该只用于小任务。检查AsyncTask javadoc的以下声明:
AsyncTask旨在成为围绕Thread和Handler的帮助程序类 并不构成通用的线程框架。 AsyncTasks 理想情况下应该用于短期操作(几秒钟的时间) 大多数。)如果你需要保持线程长时间运行, 强烈建议您使用提供的各种API java.util.concurrent pacakge,例如Executor,ThreadPoolExecutor和 FutureTask
所以从你开始检查你的线程的状态,如果它正在运行然后不做任何事情,如果它没有运行然后启动将下载你的图像的线程......