![Android移動(dòng)應(yīng)用開發(fā)-線程間的通信與異步機(jī)制_第1頁(yè)](http://file4.renrendoc.com/view/eade5fbee27c0b8f5af92f48f11d48ef/eade5fbee27c0b8f5af92f48f11d48ef1.gif)
![Android移動(dòng)應(yīng)用開發(fā)-線程間的通信與異步機(jī)制_第2頁(yè)](http://file4.renrendoc.com/view/eade5fbee27c0b8f5af92f48f11d48ef/eade5fbee27c0b8f5af92f48f11d48ef2.gif)
![Android移動(dòng)應(yīng)用開發(fā)-線程間的通信與異步機(jī)制_第3頁(yè)](http://file4.renrendoc.com/view/eade5fbee27c0b8f5af92f48f11d48ef/eade5fbee27c0b8f5af92f48f11d48ef3.gif)
![Android移動(dòng)應(yīng)用開發(fā)-線程間的通信與異步機(jī)制_第4頁(yè)](http://file4.renrendoc.com/view/eade5fbee27c0b8f5af92f48f11d48ef/eade5fbee27c0b8f5af92f48f11d48ef4.gif)
![Android移動(dòng)應(yīng)用開發(fā)-線程間的通信與異步機(jī)制_第5頁(yè)](http://file4.renrendoc.com/view/eade5fbee27c0b8f5af92f48f11d48ef/eade5fbee27c0b8f5af92f48f11d48ef5.gif)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Android移動(dòng)應(yīng)用開發(fā)
010302040706認(rèn)識(shí)Android列表與適配器菜單與對(duì)話框設(shè)計(jì)UI控件設(shè)計(jì)設(shè)計(jì)用戶界面創(chuàng)建Android項(xiàng)目Android本地存儲(chǔ)書目錄140911BroadcastReceiver與廣播通信Service與后臺(tái)服務(wù)設(shè)計(jì)ContentProvider與應(yīng)用間數(shù)據(jù)共享網(wǎng)絡(luò)連接與管理05Activity與Fragment08131210線程間的通信與異步機(jī)制Android性能分析與測(cè)試
線程間的通信與異步機(jī)制章目錄8.1應(yīng)用程序的消息處理機(jī)制8.2異步任務(wù)封裝類8.1.1線程與單線程模型應(yīng)用程序啟動(dòng)時(shí),系統(tǒng)會(huì)創(chuàng)建一個(gè)名為“main”的主線程。它是應(yīng)用程序與AndroidUI組件包(android.widget包和android.view包)進(jìn)行交互的線程,負(fù)責(zé)把事件分發(fā)給相應(yīng)的用戶界面。因此,主線程有時(shí)也被叫作UI線程。系統(tǒng)并不會(huì)為每個(gè)組件的實(shí)例都創(chuàng)建單獨(dú)的線程。對(duì)系統(tǒng)回調(diào)進(jìn)行響應(yīng)的方法總是運(yùn)行在UI線程中。如果應(yīng)用程序在與用戶交互的同時(shí)需要執(zhí)行繁重的任務(wù),則單線程模型可能會(huì)導(dǎo)致運(yùn)行性能低,甚至?xí)枞麄€(gè)UI線程。一旦UI線程被阻塞,所有事件都不能被分發(fā),包括屏幕繪圖事件。Andoid的UI組件包并不是線程安全的。因此不允許從工作線程中操作UI—只能從UI線程中操作用戶界面。8.1.1線程與單線程模型例如,下面的代碼試圖通過(guò)loadImage()方法更新ImageView的內(nèi)容。publicclassTheadActivity1extendsActivity{@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);loadImage("/img/baidu_logo.gif",R.id.imageView1);}privateHandlerhandler=newHandler();privatevoidloadImage(finalStringurl,finalintid){handler.post(newRunnable(){publicvoidrun(){Drawabledrawable=null;try{drawable=Drawable.createFromStream(newURL(url).openStream(),"image.gif");} catch(IOExceptione){Log.d("test",e.getMessage());}if(drawable==null){Log.d("LWY","nulldrawable");} else{Log.d("LWY","notnulldrawable");}//為了測(cè)試緩存而模擬的網(wǎng)絡(luò)延時(shí)SystemClock.sleep(2000);//下面代碼破壞了單線程規(guī)則,異常會(huì)發(fā)生((ImageView)findViewById(id)).setImageDrawable(drawable);}});}}8.1.1線程與單線程模型Andoid的單線程模型必須遵守兩個(gè)規(guī)則。不要阻塞UI線程。不要在UI線程之外訪問(wèn)Andoid的UI組件包。Android提供了很多便于管理線程的類:Looper用于在一個(gè)線程中運(yùn)行一個(gè)消息循環(huán),Handler用于處理消息,HandlerThread用于使用一個(gè)消息循環(huán)啟用一個(gè)線程。Android提供的異步任務(wù)類AsyncTask簡(jiǎn)化了一些工作線程和UI交互的操作。8.1.2Handler消息傳遞機(jī)制Android的消息處理有3個(gè)核心類:Looper、Handler和Message。為一個(gè)線程建立消息循環(huán)的基本步驟為以下4步。初始化Looper。綁定Handler到CustomThread實(shí)例的Looper對(duì)象。定義處理消息的方法handleMessage()。啟動(dòng)消息循環(huán)。LooperLooper在Android中被設(shè)計(jì)用來(lái)使一個(gè)普通線程變成Looper線程。所謂Looper線程就是循環(huán)工作的線程。Looper有以下幾個(gè)重要方法。Looper.prepare()Looper.loop()Looper.prepareMainLooper()Looper.getMainLooper()Looper.quit()/Looper.quitSafely()8.1.2Handler消息傳遞機(jī)制下面的代碼是使用Looper類創(chuàng)建Looper線程的典型應(yīng)用方法。@Overridepublicvoidrun(){Looper.prepare();mHandler=newHandler(){publicvoidhandleMessage(Messagemsg){//消息事件處理}};Looper.loop();}}通過(guò)調(diào)用Looper.loop()方法,Looper線程開始工作。它不斷從自己的消息隊(duì)列中取出隊(duì)頭的消息(也叫“任務(wù)”)執(zhí)行。8.1.2Handler消息傳遞機(jī)制HandlerHandler主要負(fù)責(zé)向消息隊(duì)列中添加消息和處理消息(只處理由自己發(fā)出的消息),即通知消息隊(duì)列要執(zhí)行一個(gè)任務(wù)[sendMessage()方法],并在輪詢到自己的時(shí)候執(zhí)行該任務(wù)[handleMessage()方法],整個(gè)過(guò)程是異步的。下面的代碼演示了在Thread子類中加入Handler實(shí)現(xiàn)消息隊(duì)列功能的方法。publicclassLooperThreadextendsThread{privateHandlerhandler;@Overridepublicvoidrun(){Looper.prepare();handler=newHandler();Looper.loop();}}8.1.2Handler消息傳遞機(jī)制通過(guò)Handler發(fā)送的Message對(duì)象有如下特點(diǎn)。message.target為該Handler對(duì)象,這確保了Looper執(zhí)行到該Message對(duì)象時(shí)能找到處理它的Handler,即loop()方法中的代碼。message.target為該Handler對(duì)象,這確保了Looper執(zhí)行到該Message對(duì)象時(shí)能找到處理它的Handler,即loop()方法中的代碼。post()方法發(fā)出的Message對(duì)象,其回調(diào)為Runnable對(duì)象。msg.target.dispatchMessage(msg);8.1.2Handler消息傳遞機(jī)制Handler擁有以下兩個(gè)重要的特點(diǎn)。Handler可以在任意線程中發(fā)送消息,這些消息會(huì)被添加到關(guān)聯(lián)的消息隊(duì)列中,如左圖所示。Handler在它關(guān)聯(lián)的Looper線程中處理消息,如右圖所示。8.1.2Handler消息傳遞機(jī)制Handler的這兩個(gè)特點(diǎn)解決了Android不能在其他非主線程中更新UI的問(wèn)題。Handler的解決方案就是在Activity中創(chuàng)建Handler并將其引用傳遞給工作線程,工作線程執(zhí)行完任務(wù)后使用Handler發(fā)送消息并通知Activity更新UI,如圖所示。8.1.2Handler消息傳遞機(jī)制Message和MessageQueueMessage是線程之間傳遞信息的載體,包含對(duì)消息的描述和任意的數(shù)據(jù)對(duì)象。Message中包含兩個(gè)額外的int字段(Message.arg1和Message.arg2)和一個(gè)Object字段,并通過(guò)Message.what來(lái)標(biāo)識(shí)信息,以便用不同方式處理Message。MessageQueue是用來(lái)容納Message的,其中的Message是由Looper分發(fā)的。Message不能直接添加到MessageQueue中,而要通過(guò)與Looper關(guān)聯(lián)的Handler添加。應(yīng)用程序一啟動(dòng)UI線程(也就是主線程)就會(huì)有一個(gè)MessageQueue,而如果是自己另外啟動(dòng)的一個(gè)子線程就不會(huì)有MessageQueue對(duì)象。8.1.3Thread+Handler+Message應(yīng)用下面介紹使用消息處理機(jī)制實(shí)現(xiàn)異步任務(wù)的方法。首先,在創(chuàng)建線程池的類(如MainActivity)的構(gòu)造過(guò)程中實(shí)例化Handler對(duì)象,并將該對(duì)象存儲(chǔ)在全局變量中。例如:privatePhotoManager(){…//定義附加到UI線程的處理程序?qū)ο骽andler=newHandler(Looper.getMainLooper()){…/**handleMessage()方法中定義用于處理消息的響應(yīng)事件*theHandlerreceivesanewMessagetoprocess*/@OverridepublicvoidhandleMessage(MessageinputMessage){//從PhotoTask中獲取消息傳遞過(guò)來(lái)的圖像信息PhotoTaskphotoTask=(PhotoTask)inputMessage.obj;…}…}}8.1.3Thread+Handler+Message應(yīng)用接下來(lái),將任務(wù)對(duì)象和狀態(tài)代碼傳遞給實(shí)例化Handler的對(duì)象。例如,下面是一個(gè)在后臺(tái)線程上運(yùn)行的Runnable,它將對(duì)Bitmap進(jìn)行解碼并將其存儲(chǔ)在其父對(duì)象PhotoTask中。Runnable還會(huì)存儲(chǔ)狀態(tài)代碼DECODE_STATE_COMPLETED。//將photo解碼為BitmapsclassPhotoDecodeRunnableimplementsRunnable{…PhotoDecodeRunnable(PhotoTaskdownloadTask){photoTask=downloadTask;}…//獲取下載的字節(jié)數(shù)組byte[]imageBuffer=photoTask.getByteBuffer();…//執(zhí)行線程任務(wù)publicvoidrun(){…//解碼字節(jié)數(shù)組returnBitmap=BitmapFactory.decodeByteArray(imageBuffer,0,imageBuffer.length,bitmapOptions);…//給ImageView設(shè)置BitmapphotoTask.setImage(returnBitmap);//報(bào)告解碼完成photoTask.handleDecodeState(DECODE_STATE_COMPLETED);…}…}8.1.3Thread+Handler+Message應(yīng)用其中的PhotoTask對(duì)象中存放著對(duì)解碼數(shù)據(jù)以及將顯示該數(shù)據(jù)的View對(duì)象的引用。publicclassPhotoTask{…//獲取創(chuàng)建線程池對(duì)象的Handle對(duì)象photoManager=PhotoManager.getInstance();…publicvoidhandleDecodeState(intstate){intoutState;//將解碼狀態(tài)轉(zhuǎn)換為完成狀態(tài)switch(state){casePhotoDecodeRunnable.DECODE_STATE_COMPLETED:outState=PhotoManager.TASK_COMPLETE;break;…}…//調(diào)用狀態(tài)處理方法handleState(outState);}…//將狀態(tài)傳遞給PhotoManagervoidhandleState(intstate){/**將此任務(wù)的句柄和當(dāng)前狀態(tài)傳遞給創(chuàng)建線程池的類*/photoManager.handleState(this,state);}…}8.1.3Thread+Handler+Message應(yīng)用PhotoManager對(duì)象從PhotoTask對(duì)象接收狀態(tài)代碼和PhotoTask對(duì)象的句柄。publicclassPhotoManager{…//處理來(lái)自任務(wù)的狀態(tài)消息publicvoidhandleState(PhotoTaskphotoTask,intstate){switch(state){…//圖像下載并完成解碼后的任務(wù)處理caseTASK_COMPLETE:MessagecompleteMessage=handler.obtainMessage(state,photoTask);completeMessage.sendToTarget();break;…}…}}default:/**從UI傳遞其他消息*/super.handleMessage(inputMessage);}…}…}…}privatePhotoManager(){……h(huán)andler=newHandler(Looper.getMainLooper()){@OverridepublicvoidhandleMessage(MessageinputMessage){//獲取消息傳遞的對(duì)象PhotoTaskphotoTask=(PhotoTask)inputMessage.obj;//獲取任務(wù)中的ImageView對(duì)象PhotoViewlocalView=photoTask.getPhotoView();…switch(inputMessage.what){…//完成解碼caseTASK_COMPLETE:/**將Bitmap顯示在View上*/localView.setImageBitmap(photoTask.getImage());break;…8.1.3Thread+Handler+Message應(yīng)用最后,通過(guò)Handler.handleMessage()方法檢查每一條傳入Message的狀態(tài)代碼。任務(wù)8.1實(shí)現(xiàn)音樂(lè)播放器本地音樂(lè)的異步加載功能【任務(wù)介紹】1.任務(wù)描述在第6章任務(wù)6.1的基礎(chǔ)上,實(shí)現(xiàn)音樂(lè)播放器本地音樂(lè)的異步加載功能。2.運(yùn)行結(jié)果本任務(wù)運(yùn)行結(jié)果如圖所示。章目錄8.1應(yīng)用程序的消息處理機(jī)制8.2異步任務(wù)封裝類8.2.1HandlerThread先分析HandlerThread的源代碼。publicclassHandlerThreadextendsThread{intmPriority;//線程執(zhí)行優(yōu)先級(jí)intmTid=-1;//調(diào)用線程的標(biāo)識(shí)符LoopermLooper;//線程內(nèi)部的Looper對(duì)象,一個(gè)線程只有一個(gè)Looper對(duì)象private@NullableHandlermHandler;//與Looper綁定的Handler對(duì)象publicHandlerThread(Stringname){super(name);//設(shè)置優(yōu)先級(jí)mPriority=Process.THREAD_PRIORITY_DEFAULT;}publicHandlerThread(Stringname,intpriority){super(name);mPriority=priority;}//Looper開啟循環(huán)前調(diào)用,可在子類中按需覆寫實(shí)現(xiàn)protectedvoidonLooperPrepared(){}
8.2.1HandlerThread@Overridepublicvoidrun(){//返回調(diào)用線程的標(biāo)識(shí)符mTid=Process.myTid();//初始化線程本地變量LooperLooper.prepare();synchronized(this){//從Looper中獲取本線程的Looper對(duì)象mLooper=Looper.myLooper();notifyAll();//喚醒線程}Process.setThreadPriority(mPriority);onLooperPrepared();//回調(diào)方法,在循環(huán)之前,可在子類中按需覆寫實(shí)現(xiàn)Looper.loop();mTid=-1;}//返回Looper對(duì)象publicLoopergetLooper(){//如果線程不是可用狀態(tài),則返回nullif(!isAlive()){returnnull;}8.2.1HandlerThread
//如果線程被啟動(dòng)了,但是mLooper對(duì)象還沒(méi)有被初始化,則讓線程進(jìn)入等待狀態(tài),//直到mLooper對(duì)象被初始化后線程被喚醒synchronized(this){while(isAlive()&&(mLooper==null)){try{wait();}catch(InterruptedExceptione){}}}returnmLooper;}@NonNull//懶加載初始化Handler的單例對(duì)象,該Handler與此線程獲取的Looper進(jìn)行綁定publicHandlergetThreadHandler(){if(mHandler==null){mHandler=newHandler(getLooper());}returnmHandler;}8.2.1HandlerThread//退出,執(zhí)行的是looper.quit()方法,其實(shí)執(zhí)行的是Looper中的MessageQueue.quit()方法publicbooleanquit(){Looperlooper=getLooper();if(looper!=null){looper.quit();returntrue;}returnfalse;}//同上述方法,執(zhí)行的是MessageQueue.quit()方法publicbooleanquitSafely(){Looperlooper=getLooper();if(looper!=null){looper.quitSafely();returntrue;}returnfalse;}//返回調(diào)用線程的標(biāo)識(shí)符publicintgetThreadId(){returnmTid;}}8.2.1HandlerThread通過(guò)分析源代碼可以發(fā)現(xiàn)以下幾點(diǎn)。HandlerThread繼承Thread,所以它的本質(zhì)是線程的一種實(shí)現(xiàn)。HandlerThread內(nèi)部有一個(gè)Looper對(duì)象,在線程啟動(dòng)的時(shí)候,會(huì)初始化線程本地變量Looper。HandlerThread內(nèi)部有Handler對(duì)象,但采用的是懶加載的單例,在使用之前并未進(jìn)行初始化。在調(diào)用getThreadHandler()方法和getLooper()方法之前,必須確保線程已經(jīng)啟動(dòng)了[調(diào)用start()方法],否則線程會(huì)進(jìn)入等待狀態(tài),直到在run()方法內(nèi)部的mLooper對(duì)象被賦值。在Looper開啟循環(huán)[調(diào)用loop()方法]之前,會(huì)執(zhí)行onLooperPrepared()方法,它默認(rèn)是一個(gè)空實(shí)現(xiàn),可在子類中按需覆寫實(shí)現(xiàn)。quit()方法和quitSafely()方法調(diào)用的是Looper對(duì)象的相應(yīng)方法,其實(shí)最終調(diào)用的都是Looper內(nèi)部MessageQueue的quit()方法。HandlerThread只是把線程和Looper進(jìn)行簡(jiǎn)單的封裝,剩下的很多操作和異步消息處理機(jī)制是一樣的。8.2.1HandlerThread下面是一個(gè)使用HandlerThread下載圖片集的示例。publicclassHandlerThreadActivityextendsAppCompatActivity{//圖片地址集合privateStringurl[]={"/20160903083245762",…};privateImageViewimageView;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_handler_thread);imageView=(ImageView)findViewById(R.id.image);//創(chuàng)建異步HandlerThreadHandlerThreadhandlerThread=newHandlerThread("downloadImage");//必須先開啟線程handlerThread.start();//子線程Handler,用于異步下載圖片HandlerchildHandler=newHandler(handlerThread.getLooper(),newChildCallback());for(inti=0;i<url.length;i++){childHandler.sendEmptyMessageDelayed(i,1000*i);//每秒更新一張圖片}}8.2.1HandlerThread/***該Callback運(yùn)行于子線程*/classChildCallbackimplementsHandler.Callback{@OverridepublicbooleanhandleMessage(Messagemessage){//在子線程中進(jìn)行網(wǎng)絡(luò)請(qǐng)求Bitmapbitmap=downloadUrlBitmap(url[message.what]);ImageModelimageModel=newImageModel();imageModel.url=url[message.what];imageModel.bitmap=bitmap;Messagemsg=newMessage();msg.what=message.what;msg.obj=imageModel;mUIHandler.sendMessage(msg);//通知主線程更新UIreturnfalse;}}privateBitmapdownloadUrlBitmap(StringurlString){HttpURLConnectionurlConnection=null;BufferedInputStreamin=null;Bitmapbitmap=null;8.2.1HandlerThreadtry{finalURLurl=newURL(urlString);urlConnection=(HttpURLConnection)url.openConnection();in=newBufferedInputStream(urlConnection.getInputStream(),8*1024);bitmap=BitmapFactory.decodeStream(in);}catch(IOExceptione){e.printStackTrace();}finally{if(urlConnection!=null){urlConnection.disconnect();}try{if(in!=null){in.close();}}catch(IOExceptione){e.printStackTrace();}}returnbitmap;}/***用于更新UI*/privateHandlermUIHandler=newHandler(){@OverridepublicvoidhandleMessage(Messagemsg){ImageModelmodel=(ImageModel)msg.obj;imageView.setImageBitmap(model.bitmap);}};
classImageModel{Stringurl;Bitmapbitmap;ImageModel(){}}}8.2.2AsyncTaskAsyncTask是抽象類,在AsyncTask中定義了3種泛型類型:Params對(duì)應(yīng)doInBackground()方法
的參數(shù)類型。AProgress對(duì)應(yīng)onProgressUpdate()方法的參數(shù)類型,其顯示后臺(tái)
任務(wù)執(zhí)行的百分比。BResult對(duì)應(yīng)onPostExecute()方法的參數(shù)類型,是后臺(tái)執(zhí)行任務(wù)最終返回的結(jié)果,例如String。C8.2.2AsyncTaskAsyncTask執(zhí)行的每一步都對(duì)應(yīng)一個(gè)回調(diào)方法,這些方法不應(yīng)該由應(yīng)用程序調(diào)用,開發(fā)者需要做的就是實(shí)現(xiàn)這些方法。首先子類化AsyncTask,然后實(shí)現(xiàn)AsyncTask中定義的下面一個(gè)或幾個(gè)方法。-÷×+onPreExecute()方法執(zhí)行預(yù)處理。doInBackground()方法在onPreExecute()方法執(zhí)行后馬上自動(dòng)執(zhí)行,后臺(tái)進(jìn)程執(zhí)行的具體計(jì)算在這里實(shí)現(xiàn)。注意:在doInBackground()方法中不能直接操作UI。onProgressUpdate()方法運(yùn)行于UI線程。onPostExecute()方法運(yùn)行于UI線程,相當(dāng)于Handler處理UI的方式。8.2.2AsyncTask為了正確地使用AsyncTask類,必須遵守以下幾條準(zhǔn)則。312AsyncTask的實(shí)例必須在UI線程中創(chuàng)建。execute()方法必須在UI線程中調(diào)用。不要手動(dòng)地調(diào)用onPreExecute()、onPostExecute()、doInBackground()和onProgressUpdate()這幾個(gè)方法。注意,當(dāng)Activity重新創(chuàng)建時(shí)(屏幕旋轉(zhuǎn)/Activity被意外銷毀后恢復(fù)),之前運(yùn)行的AsyncTask(非靜態(tài)的
內(nèi)部類)持有的之前Activity引用已無(wú)效。8.2.2AsyncTask下面的示例演示了使用AsyncTask實(shí)現(xiàn)網(wǎng)絡(luò)下載的方法。publicclassMainActivityextendsAppCompatActivity{privatestaticfinalStringFILE_NAME="test.pdf";//下載文件的名稱privatestaticfinalStringPDF_URL="http://***/AsyncTask.pdf";privateProgressBarmProgressBar;privateButtonmDownloadBtn;privateTextViewmStatus;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();setListener();}privatevoidinitView(){mProgressBar=(ProgressBar)findViewById(R.gressBar);mDownloadBtn=(Button)findViewById(R.id.download);mStatus=(TextView)findViewById(R.id.status);}8.2.2AsyncTaskprivatevoidsetListener(){mDownloadBtn.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){//AsyncTask實(shí)例必須在主線程創(chuàng)建DownloadAsyncTaskasyncTask=newDownloadAsyncTask();asyncTask.execute(PDF_URL);}});}privateclassDownloadAsyncTaskextendsAsyncTask<String,Integer,Boolean>{privateStringmFilePath;//下載文件的保存路徑@OverrideprotectedBooleandoInBackground(String…params){if(params!=null&¶ms.length>0){StringpdfUrl=params[0];try{URLurl=newURL(pdfUrl);URLConnectionurlConnection=url.openConnection();InputStreamin=urlConnection.getInputStream();intcontentLength=urlConnection.getContentLength();
8.2.2AsyncTask//獲取內(nèi)容總長(zhǎng)度mFilePath=Environment.getExternalStorageDirectory()+File.separator+FILE_NAME;//若存在同名文件則刪除FilepdfFile=newFile(mFilePath);if(pdfFile.exists()){booleanresult=pdfFile.delete();if(!result){returnfalse;}}
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 現(xiàn)代家居裝飾風(fēng)格與心理健康關(guān)系探討
- 構(gòu)建以服務(wù)功能為導(dǎo)向的綠色生態(tài)環(huán)境教育體系
- 生物醫(yī)藥與健康產(chǎn)業(yè)的投資潛力研究
- 現(xiàn)代化技術(shù)與醫(yī)療中心的高層建筑設(shè)計(jì)思考
- 生態(tài)城市建設(shè)中環(huán)境科學(xué)的應(yīng)用研究
- Unit 5 We're family Period 3 (說(shuō)課稿)-2024-2025學(xué)年外研版(三起)(2024)英語(yǔ)三年級(jí)上冊(cè)
- 2024-2025學(xué)年高中生物 第四部分 淺嘗現(xiàn)代生物技術(shù)說(shuō)課稿 浙科版選修1
- 2024-2025學(xué)年高中物理 第四章 電磁感應(yīng) 5 電磁感應(yīng)現(xiàn)象的兩類情況(1)說(shuō)課稿 新人教版選修3-2
- 9古代科技 耀我中華-獨(dú)領(lǐng)風(fēng)騷的古代技術(shù)創(chuàng)造(說(shuō)課稿)2023-2024學(xué)年統(tǒng)編版道德與法治五年級(jí)上冊(cè)
- 26 手術(shù)臺(tái)就是陣地 說(shuō)課稿-2024-2025學(xué)年統(tǒng)編版語(yǔ)文三年級(jí)上冊(cè)001
- 產(chǎn)品報(bào)價(jià)單(5篇)
- 康復(fù)護(hù)理練習(xí)題庫(kù)(附答案)
- 不銹鋼欄桿施工工藝
- 陜西演藝集團(tuán)有限公司招聘筆試題庫(kù)2023
- 小型餐飲店退股協(xié)議書
- 第九講 全面依法治國(guó)PPT習(xí)概論2023優(yōu)化版教學(xué)課件
- 兩淮礦區(qū)地面定向多分支水平井鉆進(jìn)作業(yè)技術(shù)規(guī)程
- vc約起來(lái)史上最全180個(gè)知名投資人聯(lián)系方式
- 社會(huì)穩(wěn)定風(fēng)險(xiǎn)評(píng)估報(bào)告風(fēng)險(xiǎn)評(píng)估參考
- GB/T 14343-2008化學(xué)纖維長(zhǎng)絲線密度試驗(yàn)方法
- 制冷操作證培訓(xùn)教材-制冷與空調(diào)設(shè)備運(yùn)行操作作業(yè)培課件
評(píng)論
0/150
提交評(píng)論