2

我有一个 android 服务,在 onStart 方法中,我从 Intent 活动中获取了许多字符串,然后执行 AsynTask 以从 Internet 下载文件。

当活动运行时,这可以正常工作,但是当我停止活动时,这会重新启动 onStart 方法,但显然意图是 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);

现在我的问题是,在我的银河系关系中,如果我进入应用程序运行时列表并销毁我的应用程序,服务停止,停止下载,停止发送通知等?我必须如何绑定服务来解决这个问题?

4

3 回答 3

2

使用 IntentService。IntentService 是专门为做你想做的事而设计的。您不必实现 onStart、onStartCommand 等。工作在后台线程上运行。一旦工作完成,线程就会被销毁。

无论 Activity 的状态如何,IntentService 都会继续运行。

您可能遇到的一个问题是您将 Intent 发送到 Activity 的错误位置,或者您没有检查操作是否完成。在发送 Intent 之前,检查 SharedPreferences 中的标志(如果标志不存在,则表示您是第一次开始)。当您发送 Intent 时,在 SharedPreferences 中存储一个标志以指示您发送了它。当您的 IntentService 收到 Intent 时,让它更新标志以表示它已收到它。在 IntentService 完成之前,让它再次更新标志。等等。

于 2012-11-21T22:41:51.903 回答
1

我没有评论你的问题的声誉,所以我会写一个答案:)

首先,在我看来,如果您的服务只是这样做,从 Internet 获取一些字符串并下载文件,您就不需要该服务。AsyncTaks 足以解决您的问题,而且实现起来更简单。这样做,你可以避免你的意图问题。

来自 Android API:

AsyncTask 允许正确和轻松地使用 UI 线程。此类允许在 UI 线程上执行后台操作并发布结果,而无需操作线程和/或处理程序。

但是,如果您决定继续使用服务,我会确切知道您的活动中何时调用 startService。

如果您对何时使用 AsyncTask、Service、IntentService 和 Thread 有疑问,此链接可以帮助您。

于 2012-11-21T14:10:56.187 回答
0

这将是我的建议...

在服务中使用线程而不是 AsyncTask,因为 AsynTask 应该只用于小任务。检查AsyncTask javadoc中的以下语句:

AsyncTask 被设计为围绕ThreadHandler的辅助类 ,并不构成通用线程框架。AsyncTasks 最好用于短时间的操作(最多几秒钟)。如果您需要保持线程长时间运行,强烈建议您使用 java.util.concurrent 包提供的各种 API,例如ExecutorThreadPoolExecutorFutureTask

所以从你开始检查你的线程的状态,如果它正在运行,那么不要做任何事情,如果它没有运行,那么启动将下载你的图像的线程......

于 2012-11-21T18:27:31.053 回答