1

要件に従って、画像がバックグラウンドスレッド処理からダウンロードされているアプリケーションがあります。必要に応じて、写真をダウンロードしている間、すべてのアクティビティの水平プログレスバーを表示したいと思います。また、これは私のアプリケーションのJson解析全体を担当するクラスです。そのために、Serviceを拡張するクラスを実装し、そのonCreateメソッドを呼び出しました。しかし、現在のプログレスバーを更新する方法についてはまだわかりません。また、ユーザーが他の画面をオンにした場合、それに応じてプログレスバーを更新する必要があります。以前はIntentServiceクラスを使用しようとしましたが、

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

しかし、残念ながら、それは私の状況に適合せず、私は次のようなlogcat例外を取得し続けました'cant instantiate the default constructor of IntentService'

私は本当にこの状況で立ち往生しています。この状況に誰かが直面した場合は、何らかの方法/コードスニペットを提案してください。

これが私の現在のサンプルコードです:http://pastebin.com/HCWFPtbb

4

1 に答える 1

0
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);
                    }
            }

    }

そして、Activityコンポーネントに、Threadクラスからのコールバック用に以下のインターフェースを実装させます。

public interface DownloadThreadListener {

void handleDownloadThreadUpdate(Bitmap bmap,String bmapUrl);

Map<String, Bitmap> giveImages_Map();

ConcurrentHashMap<String, SoftReference<Bitmap>> giveSoftImages_Map();

}

于 2012-09-04T14:12:20.680 に答える