在所有活动中使用Service更新ProgressBar



我有一个应用程序,根据要求,从后台线程处理下载图像。根据需要,我想在下载照片的同时,显示所有活动的水平进度条。这也是负责我的应用程序的整个Json解析的类。为此,我实现了一个扩展Service的类,并调用了它的onCreate方法。但我仍然不清楚如何更新当前屏幕中的进度条,如果用户切换到其他屏幕,进度条也应该相应更新。以前我尝试过使用IntentService类,但它需要

MyService (String name){
  super(name);
}

但不幸的是,这不适合我的情况,我一直在获取像'cant instantiate the default constructor of IntentService' 这样的logcat异常

我真的被这种情况困住了。如果有人遇到过这种情况,请建议我一些方法/代码片段。

这是我当前的示例代码:http://pastebin.com/HCWFPtbb

public final class DownloadThread extends Thread
    {
        private static final String       TAG           = DownloadThread.class.getSimpleName();
        private Handler                   handler;
        private int                       totalQueued;
        private int                       totalCompleted;
        private final DownloadThreadListener listener;
        private boolean                   isRunning   = false;
        protected boolean                   isStop;
        private TaskInitiator               mtaskInitiator = null;
        /**
         * @return the isRunning
         */
        public boolean isRunning()
            {
                return isRunning;
            }
        public DownloadThread(DownloadThreadListener listener)
            {
                this.listener = listener;
                isStop = false;
            }
        @Override
        public void run()
            {
                try
                    {
                        Looper.prepare();
                        mtaskInitiator = new TaskInitiator();
                        handler = new Handler();
                        isRunning = true;
                        Looper.loop();
                    }
                catch (Throwable t)
                    {
                        Log.e(TAG, "DownloadThread halted due to an error", t);
                    }
            }
        public synchronized void requestStop()
            {
                isStop = true;
            }
        public synchronized void enqueueDownload(DownloadTask task)
            {
                mtaskInitiator = new TaskInitiator();
                mtaskInitiator.setTask(task);
                handler.post(mtaskInitiator);
                totalQueued++;
            }
        public synchronized void removeTasks()
            {
                if (mtaskInitiator != null)
                    {
                        handler.removeCallbacks(mtaskInitiator);
                        totalQueued = 0;
                        totalCompleted = 0;
                    }
            }
        class TaskInitiator implements Runnable
            {
                private DownloadTask task = null;
                public DownloadTask getTask()
                    {
                        return task;
                    }
                public void setTask(DownloadTask task)
                    {
                        this.task = task;
                    }
                public TaskInitiator()
                    {
                        // TODO Auto-generated constructor stub
                    }
                @Override
                public void run()
                    {
                        try
                            {
                                task.run();
                            }
                        finally
                            {
                                if (isStop)
                                    {
                                        Looper.myLooper().quit();
                                    }
                                synchronized (DownloadThread.this)
                                    {
                                        signalUpdate(task.getCurrentBitmap(), task.getCurrentFeedUrl());
                                        task.setCurrentBitmap(null);
                                        totalCompleted++;
                                    }
                            }
                    }
            }
        public synchronized int getTotalQueued()
            {
                return totalQueued;
            }
        public synchronized int getTotalCompleted()
            {
                return totalCompleted;
            }
        public void signalUpdate(Bitmap bmap, String bmapUrl)
            {
                if (listener != null)
                    {
                        listener.handleDownloadThreadUpdate(bmap, bmapUrl);
                    }
            }
    }

让您的"活动"组件实现下面的接口,以便从Thread类进行回调。

public interface DownloadThreadListener {
void handleDownloadThreadUpdate(Bitmap bmap,String bmapUrl);
Map<String, Bitmap> giveImages_Map();
ConcurrentHashMap<String, SoftReference<Bitmap>> giveSoftImages_Map();

}

最新更新