內置網頁提供大文件下載內存溢出
項目需求,PC通過IP地址訪問靜態網頁,網頁提供文件下載,文件過大,直接oom,求老師指導
public?class?ClienDownloadService?extends?Service?{ ????private?ExecutorService?threadPool; ????private?ServerSocket?serverSocket; ????private?InetSocketAddress?address; ????private?boolean?isEnable; ????public?IBinder?onBind(Intent?intent)?{ ????????return?null; ????} ????public?void?onCreate()?{ ????????super.onCreate(); ????????initPlatfrom(); ????????startAsync(); ????} ????public?void?initPlatfrom()?{ ????????threadPool?=?Executors.newCachedThreadPool(); ????} ????private?void?startAsync()?{ ????????isEnable?=?true; ????????new?Thread(new?Runnable()?{ ????????????public?void?run()?{ ????????????????try?{ ????????????????????address?=?new?InetSocketAddress(8098); ????????????????????serverSocket?=?new?ServerSocket(); ????????????????????serverSocket.bind(address); ????????????????????while?(isEnable)?{ ????????????????????????final?Socket?socket?=?serverSocket.accept(); ????????????????????????threadPool.execute(new?Runnable()?{ ????????????????????????????public?void?run()?{ ????????????????????????????????try?{ ????????????????????????????????????buileRemoteSocket(socket); ????????????????????????????????}?catch?(Exception?e)?{ ????????????????????????????????????e.printStackTrace(); ????????????????????????????????} ????????????????????????????} ????????????????????????}); ????????????????????} ????????????????}?catch?(Exception?e)?{ ????????????????????e.printStackTrace(); ????????????????} ????????????} ????????}).start(); ????} ????private?void?buileRemoteSocket(Socket?socket)?throws?Exception?{ ????????InputStream?in?=?socket.getInputStream(); ????????BufferedReader?reader?=?new?BufferedReader(new?InputStreamReader(in)); ????????String?line?=?""; ????????while?((line?=?reader.readLine())?!=?null)?{ ????????????if?(line.startsWith("GET"))?{ ????????????????String?uri?=?line.split("?")[1]; ????????????????response(socket,?uri); ????????????} ????????} ????} ????public?void?response(Socket?socket,?String?assetsPath)?throws?Exception?{ ????????assetsPath?=?assetsPath.substring(1); ????????if?(assetsPath.equals(""))?{ ????????????assetsPath?=?"index.html"; ????????} ????????InputStream?in?=?getAssets().open(assetsPath); ????????ByteArrayOutputStream?bos?=?new?ByteArrayOutputStream(); ????????byte[]?buffer?=?new?byte[8192]; ????????int?len?=?0; ????????while?((len?=?in.read(buffer))?!=?-1)?{ ????????????bos.write(buffer,?0,?len); ????????} ????????byte[]?raw?=?bos.toByteArray(); ????????in.close(); ????????OutputStream?nos?=?socket.getOutputStream(); ????????PrintStream?printer?=?new?PrintStream(nos); ????????printer.println("HTTP/1.1?200?OK"); ????????printer.println("Content-length:"?+?raw.length); ????????if?(assetsPath.endsWith(".html"))?{ ????????????printer.println("Content-Type:text/html"); ????????}?else?if?(assetsPath.endsWith(".js"))?{ ????????????printer.println("Content-Type:text/js"); ????????}?else?if?(assetsPath.endsWith(".css"))?{ ????????????printer.println("Content-Type:text/css"); ????????}?else?if?(assetsPath.endsWith(".jpg"))?{ ????????????printer.println("Content-Type:text/jpg"); ????????}?else?if?(assetsPath.endsWith(".png"))?{ ????????????printer.println("Content-Type:text/png"); ????????} ????????printer.println(); ????????printer.write(raw); ????????printer.flush(); ????????printer.close(); ????} ????public?void?onDestroy()?{ ????????super.onDestroy(); ????????stopAsync(); ????} ????public?void?stopAsync()?{ ????????isEnable?=?false; ????????try?{ ????????????serverSocket.close(); ????????}?catch?(IOException?e)?{ ????????????e.printStackTrace(); ????????} ????} }
2017-02-07
解決了么