Download Manager notes

steps

1.onDownloadStartNoStream

   2.3 in BrowserActivity.onDownloadStartNoStream, 3.2 in Controller to DownloadHandler.onDownloadStartNoStream.

2.in onDownloadStartNoStream

  check sdcard

  generate DownloadManager.Request

  set download path and filename.

3.DownloadManager.enque(Request)

   in enque of DownloadManager, it will insert the download item to database.

4. since DownloadService regist a ContentObserver on DownloadProvider's uri.

 so the DownloadProvider's 'onChange' will be called when the database has changed.

5. in the onChange ot the ContentObserver, call 'DownloadService.updateFromProvider'

and then start a new thread.

mUpdateThread = new UpdateThread();
mSystemFacade.startThread(mUpdateThread);

6. in the thread's 'run' function

traverse the database , get the data into a DownloadInfo class.

and call DownloadInfo.startIfReady() to start a thread to download

DownloadThread downloader = new DownloadThread(mContext, mSystemFacade, this,
                storageManager);
        mHasActiveThread = true;
        mSystemFacade.startThread(downloader);

call RealSystemFacade.startThread()

//mSystemFacade was assigned in

    public void onCreate() {
        super.onCreate();
        if (Constants.LOGVV) {
            Log.v(Constants.TAG, "Service onCreate");
        }

        if (mSystemFacade == null) {
            mSystemFacade = new RealSystemFacade(this);
        }

7 in RealSystemFacade.startThread()

call DownloadThread's run()

start download.

    public void run() {
        Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);

        State state = new State(mInfo);
        AndroidHttpClient client = null;
        PowerManager.WakeLock wakeLock = null;
        int finalStatus = Downloads.Impl.STATUS_UNKNOWN_ERROR;

        try {
            PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
            wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, Constants.TAG);
            wakeLock.acquire();


            if (Constants.LOGV) {
                Log.v(Constants.TAG, "initiating download for " + mInfo.mUri);
            }

            client = AndroidHttpClient.newInstance(userAgent(), mContext);

            boolean finished = false;
            while(!finished) {
                Log.i(Constants.TAG, "Initiating request for download " + mInfo.mId);
                HttpGet request = new HttpGet(state.mRequestUri);
                try {
                    executeDownload(state, client, request);
                    finished = true;
                } catch (RetryDownload exc) {
                    // fall through
                } finally {
                    request.abort();
                    request = null;
                }
            }

            if (Constants.LOGV) {
                Log.v(Constants.TAG, "download completed for " + mInfo.mUri);
            }
            finalizeDestinationFile(state);
            finalStatus = Downloads.Impl.STATUS_SUCCESS;
        } catch (StopRequest error) {
            // remove the cause before printing, in case it contains PII
            Log.w(Constants.TAG,
                    "Aborting request for download " + mInfo.mId + ": " + error.getMessage());
            finalStatus = error.mFinalStatus;
            // fall through to finally block
        } catch (Throwable ex) { //sometimes the socket code throws unchecked exceptions
            Log.w(Constants.TAG, "Exception for id " + mInfo.mId + ": " + ex);
            finalStatus = Downloads.Impl.STATUS_UNKNOWN_ERROR;
            // falls through to the code that reports an error
        } finally {
            if (wakeLock != null) {
                wakeLock.release();
                wakeLock = null;
            }
            if (client != null) {
                client.close();
                client = null;
            }
            cleanupDestination(state, finalStatus);
            notifyDownloadCompleted(finalStatus, state.mCountRetry, state.mRetryAfter,
                                    state.mGotData, state.mFilename,
                                    state.mNewUri, state.mMimeType);
            mInfo.mHasActiveThread = false;
        }
    


 

webkit download notes

1, ResourceHandle

a class for managing Resource downloading, it's has functions "connection","loadResourceSynchronously" and so forth.

2.ResourceHandleClient

ResourceHandle's client who may really need the data, and using ResourceHandle to download it.

3.ResourceHandleInternal

media class between ReourceHandle and ResourehandleClient.

ResourceHandle use it to find it's client. (so that we can change it's ResourceHandle's real client).

4,ResourceLoader

son of ResourceHandleClient, it will use ResourceHandle to download data, client of ResourceHandle.

5.MainResourceLoader

son of ResourceLoader, same function as it's parent,  it will load Main resource, client of ResourceHandle.

6. FrameLoader

member of ResourceLoader, also memeber of MainResourceLoader.

7.FrameLoaderClient

FrameLoader's client. ResourceLoader's member's client.  ResoruceHandle'client's memeber's client.

8.FrameLoaderClientAndroid

son of FrameLoaderClient.  ResoruceHandle'client's memeber's client.

9.ResourceLoaderAndroid

member of ResourceHandleInternal. only in android. has nothing to do with ResourceLoader.

may be real download work in android. ?? it's should be android's ResourceHandle.

10. WebUrlLoader

son of ResourceLoaderAndroid, do real work.

11.WebUrlLoaderClient (I think may be we should call WebUrlLoaderWorker better)

client of WebUrlLoader, do work for WebUrlLoader.

(may be different from the client relation ship we talked between "ResourceHandle" and "ResourceHandleClient")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值