private GameTimeController() { _gameStartTime = getDayStartTime(); GameServer.getInstance().addListener(new OnStartListenerImpl()); StringBuilder msg = new StringBuilder(); msg.append("GameTimeController: initialized.").append(" "); msg.append("Current time is "); msg.append(getGameHour()).append(":"); if (getGameMin() < 10) msg.append("0"); msg.append(getGameMin()); msg.append(" in the "); if (isNowNight()) msg.append("night"); else msg.append("day"); msg.append("."); _log.info(msg.toString()); long nightStart = 0; long dayStart = 60 * 60 * 1000; while (_gameStartTime + nightStart < System.currentTimeMillis()) nightStart += 4 * 60 * 60 * 1000; while (_gameStartTime + dayStart < System.currentTimeMillis()) dayStart += 4 * 60 * 60 * 1000; dayStart -= System.currentTimeMillis() - _gameStartTime; nightStart -= System.currentTimeMillis() - _gameStartTime; ThreadPoolManager.getInstance() .scheduleAtFixedRate(_dayChangeNotify, nightStart, 4 * 60 * 60 * 1000L); ThreadPoolManager.getInstance() .scheduleAtFixedRate(_dayChangeNotify, dayStart, 4 * 60 * 60 * 1000L); }
/** @param args */ public static void main(String[] args) { MethodExample e = new MethodExample(); e.setArg("321"); MethodThreadModel methodThreadModel = new MethodThreadModel(); methodThreadModel.setObject(e); methodThreadModel.setType("method"); methodThreadModel.setMethodName("test"); ThreadPoolManager.getManager().addThread(methodThreadModel); ThreadPoolManager.getManager().startThreadPool(); }
@Test public void testShutdownGetsNewThreadPool() throws Exception { Map<String, Object> cache = new HashMap<String, Object>(); ThreadPoolBuilder builder = new ThreadPoolBuilder(name.getTableNameString(), new Configuration(false)); ThreadPoolExecutor exec = ThreadPoolManager.getExecutor(builder, cache); assertNotNull("Got a null exector from the pool!", exec); // shutdown the pool and ensure that it actually shutdown exec.shutdown(); ThreadPoolExecutor exec2 = ThreadPoolManager.getExecutor(builder, cache); assertFalse("Got the same exectuor, even though the original shutdown", exec2 == exec); }
public static synchronized void destory() { decreaseUserCount(); if (sUserCount <= 0 && sSelf != null) { sSelf.clearUp(); sSelf = null; sIsPrepare = false; sUserCount = 0; if (sThemeAppinBilling != null) { sThemeAppinBilling.destory(); sThemeAppinBilling = null; } // 销毁HttpAdapter SimpleHttpAdapter.destory(); // 销毁HttpTool GoStoreHttpTool.destory(); // 释放ImageManager里面的资源 ImageManager.destory(); // 销毁线程池 ThreadPoolManager.destory(); // 销毁缓存管理器 CacheManager.destory(); GoStoreCacheManager.destory(); // 退出商店督促gc回收 System.gc(); // 把进程杀掉 android.os.Process.killProcess(android.os.Process.myPid()); } }
@Override public void run() { Bitmap bitmap = null; if (imageLoadInfo.isSearchInCache()) { bitmap = CacheManager.getImage(imageLoadInfo.getUrl()); } if (bitmap != null) { // 缓存命中 imageLoadInfo.getOnImageLoadListener().loaded(bitmap, imageLoadInfo.getUrl()); } else { L.d(L.TAG, "no hit: start download form" + imageLoadInfo.getUrl()); try { if (!imageLoadInfo.hasProgress()) { justDownLoad(); } else { downLoadWithProgress(); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); if (controllerStatus == Constants.CONTROLLER_STATUS_HOLDER) { imageLoadInfo.getOnImageLoadListener().loadFail(Message.obtainMessage(e.getMessage())); } else { L.d(L.TAG, imageLoadInfo.getUrl() + "宿主控制器destroy!"); } } } ThreadPoolManager.removeTask(this); }
@Test public void testShutdownWithReferencesDoesNotStopExecutor() throws Exception { Map<String, Object> cache = new HashMap<String, Object>(); ThreadPoolBuilder builder = new ThreadPoolBuilder(name.getTableNameString(), new Configuration(false)); ThreadPoolExecutor exec = ThreadPoolManager.getExecutor(builder, cache); assertNotNull("Got a null exector from the pool!", exec); ThreadPoolExecutor exec2 = ThreadPoolManager.getExecutor(builder, cache); assertTrue("Should have gotten the same executor", exec2 == exec); exec.shutdown(); assertFalse( "Executor is shutting down, even though we have a live reference!", exec.isShutdown() || exec.isTerminating()); exec2.shutdown(); // wait 5 minutes for thread pool to shutdown assertTrue( "Executor is NOT shutting down, after releasing live reference!", exec.awaitTermination(300, TimeUnit.SECONDS)); }
/** @param args */ public static void main(String[] args) { // 注入测试方法 ThreadPoolManager.getManager() .putFreeModel("test1", "com.shine.framework.ThreadPoolUtil.FreeThreadTest", "println"); // 注入测试方法2 ThreadPoolManager.getManager() .putFreeModel("test2", "com.shine.framework.ThreadPoolUtil.FreeThreadTest2", "println"); // 注入测试方法3 FreeThreadTest3 freeThreadTest3 = new FreeThreadTest3(); ThreadPoolManager.getManager().putFreeModel("test3", freeThreadTest3, "println"); // 初始化初始线程和最大线程 ThreadPoolManager.getManager().initFreeThreadPool(2, 100); // 启动线程池 ThreadPoolManager.getManager().startThreadPool(); ThreadPoolManager.getManager().getFreeThread().setValues("test1", "FreeThreadTest"); ThreadPoolManager.getManager().getFreeThread().setValues("test2", "FreeThreadTest2"); ThreadPoolManager.getManager().getFreeThread().setValues("test1", "FreeThreadTest"); ThreadPoolManager.getManager().getFreeThread().setValues("test1", "FreeThreadTest"); ThreadPoolManager.getManager().getFreeThread().setValues("test3", "FreeThreadTest3"); }
@Test public void testGetExpectedExecutorForName() throws Exception { Map<String, Object> cache = new HashMap<String, Object>(); ThreadPoolBuilder builder = new ThreadPoolBuilder(name.getTableNameString(), new Configuration(false)); ThreadPoolExecutor exec = ThreadPoolManager.getExecutor(builder, cache); assertNotNull("Got a null exector from the pool!", exec); ThreadPoolExecutor exec2 = ThreadPoolManager.getExecutor(builder, cache); assertTrue("Got a different exectuor, even though they have the same name", exec2 == exec); builder = new ThreadPoolBuilder(name.getTableNameString(), new Configuration(false)); exec2 = ThreadPoolManager.getExecutor(builder, cache); assertTrue( "Got a different exectuor, even though they have the same name, but different confs", exec2 == exec); builder = new ThreadPoolBuilder( name.getTableNameString() + "-some-other-pool", new Configuration(false)); exec2 = ThreadPoolManager.getExecutor(builder, cache); assertFalse( "Got a different exectuor, even though they have the same name, but different confs", exec2 == exec); }
public void run() { int currentOnline = (int) (L2World.getInstance().getAllPlayers().size() * Config.ONLINE_PLAYERS_MULTIPLIER); if (currentOnline == 1) { Announcements.getInstance().announceToAll("Сейчас 1 игрок в игре."); } else { Announcements.getInstance() .announceToAll("Сейчас " + currentOnline + " игрока(ов) в игре."); } if (Config.ONLINE_PLAYERS_ANNOUNCE_INTERVAL > 0) ThreadPoolManager.getInstance() .scheduleGeneral(new AnnounceOnline(), Config.ONLINE_PLAYERS_ANNOUNCE_INTERVAL); }
public static void shutdownThreadPoolsNow() { try { ThreadPoolManager.shutdownAllNow(); } catch (Throwable ex) { // Log info: { Level level = Level.SEVERE; Logger logger = log; if (logger.isLoggable(level)) { String message = "Failure to stop thread pools!"; logger.log(level, message, ex); } } throw new RuntimeException(ex); } }
public static synchronized void destroyNotKill() { decreaseUserCount(); if (sUserCount <= 0 && sSelf != null) { sSelf.clearUp(); sSelf = null; sIsPrepare = false; sUserCount = 0; // 销毁HttpAdapter SimpleHttpAdapter.destory(); // 释放ImageManager里面的资源 ImageManager.destory(); // 销毁线程池 ThreadPoolManager.destory(); // 销毁缓存管理器 CacheManager.destory(); GoStoreCacheManager.destory(); // 退出商店督促gc回收 System.gc(); // 这里不杀掉进程 } }
public GameServerStartup() throws Exception { long serverLoadStart = System.currentTimeMillis(); gameServer = this; printSection("Database Engine"); L2DatabaseFactory.getInstance(); printSection("IDFactory Engine"); IdFactory.getInstance(); _log.log(Level.INFO, "IdFactory: Free ObjectID's remaining: " + IdFactory.getInstance().size()); ThreadPoolManager.getInstance(); printSection("Engines"); ScriptsManager.getInstance(); ServerPacketOpCodeManager.getInstance(); printSection("World Engine"); Colors.loadColors(); GameTimeController.init(); InstanceManager.getInstance(); WorldManager.getInstance(); MapRegionManager.getInstance(); Announcements.getInstance(); GlobalVariablesManager.getInstance(); AccountShareDataTable.getInstance(); DynamicSpawnData.getInstance(); ResidenceFunctionData.getInstance(); printSection("Skills Engine"); BuffStackGroupData.getInstance(); EnchantSkillGroupsTable.getInstance(); SkillTable.getInstance().load(false); SkillTreesData.getInstance(); printSection("Items Engine"); ItemTable.getInstance().loadClient(); ItemTable.getInstance().load(false); SummonItemsData.getInstance(); EnchantBonusData.getInstance(); BuyListData.getInstance(); MultiSellData.getInstance(); RecipeData.getInstance(); // PrimeShopTable.getInstance(); TODO ArmorSetsTable.getInstance(); FishData.getInstance(); FishingRodsData.getInstance(); EnchantItemData.getInstance(); EnchantEffectTable.getInstance(); CrystallizationData.getInstance(); SoulCrystalData.getInstance(); ShapeShiftingItemsData.getInstance(); HennaTable.getInstance(); HennaTreeTable.getInstance(); AugmentationData.getInstance(); ItemPriceData.getInstance(); AbilityPointsData.getInstance(); AlchemyDataTable.getInstance(); printSection("Characters Engine"); CharTemplateTable.getInstance(); ClassTemplateTable.getInstance(); CharNameTable.getInstance(); ExperienceTable.getInstance(); AdminTable.getInstance(); RaidBossPointsManager.getInstance(); RelationListManager.getInstance(); PetDataTable.getInstance(); CharSummonTable.getInstance(); SummonPointsTable.getInstance(); HitConditionBonus.getInstance(); ObsceneFilterTable.getInstance(); printSection("Clans Engine"); ClanTable.getInstance(); ClanTable.getInstance().restoreWars(); ClanHallSiegeManager.getInstance(); ClanHallManager.getInstance(); AuctionManager.getInstance(); printSection("Geodata Engine"); GeoEngine.init(); PathFinding.init(); DoorGeoEngine.init(); printSection("NPCs Engine"); HerbDropTable.getInstance(); NpcTable.getInstance(); AutoChatDataTable.getInstance(); NpcWalkerRoutesData.getInstance(); WalkingManager.getInstance(); ZoneManager.getInstance(); StaticObjectsData.getInstance(); ItemAuctionManager.getInstance(); CastleManager.getInstance(); FortManager.getInstance().init(); SpawnTable.getInstance(); AutoSpawnHandler.getInstance(); HellboundManager.getInstance(); RaidBossSpawnManager.getInstance(); DayNightSpawnManager.getInstance().trim().notifyChangeMode(); GrandBossManager.getInstance().initZones(); FourSepulchersManager.getInstance().init(); TeleportListTable.getInstance(); BeautyShopData.getInstance(); CustomDropListDataXml.getInstance(); printSection("Residence Siege Engine"); CastleSiegeManager.getInstance().getSieges(); FortSpawnList.getInstance(); FortSiegeManager.getInstance(); CastleManorManager.getInstance(); CastleMercTicketManager.getInstance(); ManorData.getInstance(); ResidenceSiegeMusicList.getInstance(); printSection("Olympiad Engine"); Olympiad.getInstance(); HeroManager.getInstance(); printSection("Cache Engine"); CrestCache.getInstance(); HtmCache.getInstance(); PartyMatchWaitingList.getInstance(); PartyMatchRoomList.getInstance(); PetitionManager.getInstance(); CursedWeaponsManager.getInstance(); CommunityBuffTable.getInstance(); CommunityTeleportData.getInstance(); printSection("Mods Engine"); PcCafePointsManager.getInstance(); if (Config.MMO_TOP_MANAGER_ENABLED) { MMOTopManager.getInstance(); } if (Config.L2_TOP_MANAGER_ENABLED) { L2TopManager.getInstance(); } printSection("Handlers Engine"); ActionHandler.getInstance(); ActionShiftHandler.getInstance(); AdminCommandHandler.getInstance(); BypassCommandManager.getInstance(); ChatCommandManager.getInstance(); EffectHandler.getInstance(); ItemHandler.getInstance(); SkillHandler.getInstance(); TargetHandler.getInstance(); TransformHandler.getInstance(); UserCommandManager.getInstance(); VoicedHandlerManager.getInstance(); printSection("Transformations Engine"); TransformationManager.getInstance(); TransformationManager.getInstance().report(); printSection("Jump Engine"); CharJumpRoutesTable.getInstance(); printSection("Commission Engine"); CommissionManager.getInstance(); printSection("ClanSearch Engine"); ClanSearchManager.getInstance(); printSection("Awakening Engine"); AwakeningManager.getInstance(); printSection("World Statistics Engine"); if (ConfigWorldStatistic.WORLD_STATISTIC_ENABLED) { WorldStatisticsManager.getInstance(); } else { _log.log(Level.INFO, "World Statistic Engine Disabled"); } printSection("Quests Engine"); QuestManager.getInstance(); DynamicQuestManager.getInstance(); BoatManager.getInstance(); AirShipManager.getInstance(); ShuttleManager.getInstance(); GraciaSeedsManager.getInstance(); if (Config.ALLOW_WEDDING) { WeddingManager.getInstance(); } AutoChatDataTable.getInstance().setAutoChatActive(true); printSection("Scripts Engine"); ScriptsManager.getInstance().executeCoreScripts(); TaskManager.getInstance(); QuestManager.getInstance().report(); if (Config.SAVE_DROPPED_ITEM) { ItemsOnGroundManager.getInstance(); } if (Config.AUTODESTROY_ITEM_AFTER > 0 || Config.HERB_AUTO_DESTROY_TIME > 0) { ItemsOnGroundAutoDestroyManager.getInstance(); } CastleManager.getInstance().spawnDoors(); FortManager.getInstance().spawnDoors(); if (Config.ALLOW_MAIL) { MailManager.getInstance(); } MentorManager.getInstance(); DuelManager.getInstance(); Runtime.getRuntime().addShutdownHook(GameServerShutdown.getInstance()); _log.log(Level.INFO, "IdFactory: Free ObjectID's remaining: " + IdFactory.getInstance().size()); EventManager.getEventsInstances(); KnownListUpdateTaskManager.getInstance(); if ((Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) && Config.RESTORE_OFFLINERS) { OfflineTradersTable.restoreOfflineTraders(); } if (Config.DEADLOCK_DETECTOR) { _deadDetectThread = new DeadLockDetector(); _deadDetectThread.setDaemon(true); _deadDetectThread.start(); } else { _deadDetectThread = null; } printSection("Finalization"); System.runFinalization(); System.gc(); Util.printMemoryInfo(); Util.printCpuInfo(); Util.printOSInfo(); Toolkit.getDefaultToolkit().beep(); printSection("Server Thread"); LoginServerThread.getInstance().start(); SelectorConfig sc = new SelectorConfig(); sc.MAX_READ_PER_PASS = Config.MMO_MAX_READ_PER_PASS; sc.MAX_SEND_PER_PASS = Config.MMO_MAX_SEND_PER_PASS; sc.SLEEP_TIME = Config.MMO_SELECTOR_SLEEP_TIME; sc.HELPER_BUFFER_COUNT = Config.MMO_HELPER_BUFFER_COUNT; sc.TCP_NODELAY = Config.MMO_TCP_NODELAY; _gamePacketHandler = new L2GamePacketHandler(); _selectorThread = new SelectorThread<>( sc, _gamePacketHandler, _gamePacketHandler, _gamePacketHandler, new IPv4Filter()); InetAddress bindAddress = null; if (!Config.GAMESERVER_HOSTNAME.equals("*")) { try { bindAddress = InetAddress.getByName(Config.GAMESERVER_HOSTNAME); } catch (UnknownHostException e1) { _log.log( Level.ERROR, "GameServerStartup: The GameServer bind address is invalid, using all avaliable IPs. Reason: " + e1.getMessage(), e1); } } try { _selectorThread.openServerSocket(bindAddress, Config.PORT_GAME); } catch (IOException e) { _log.log( Level.FATAL, "GameServerStartup:: Failed to open server socket. Reason: " + e.getMessage(), e); System.exit(1); } _selectorThread.start(); _log.log(Level.INFO, "Maximum Numbers of Connected Players: " + Config.MAXIMUM_ONLINE_USERS); long serverLoadEnd = System.currentTimeMillis(); _log.log( Level.INFO, "Server Loaded in " + (serverLoadEnd - serverLoadStart) / 1000L + " seconds"); AutoAnnounceTaskManager.getInstance(); XMLRPCServer.getInstance(); }
@Override public void onStart() { ThreadPoolManager.getInstance().execute(_dayChangeNotify); }
@SuppressWarnings("unchecked") public GameServer() throws Exception { _instance = this; _serverStarted = time(); _listeners = new GameServerListenerList(); new File("./log/").mkdir(); version = new Version(GameServer.class); _log.info("================================================="); _log.info("Project Revision: ........ " + PROJECT_REVISION); _log.info("Build Revision: .......... " + version.getRevisionNumber()); _log.info("Update: .................. " + UPDATE_NAME); _log.info("Build date: .............. " + version.getBuildDate()); _log.info("Compiler version: ........ " + version.getBuildJdk()); _log.info("================================================="); Clients.Load(); // Initialize config Config.load(); // Check binding address checkFreePorts(); // Initialize database Class.forName(Config.DATABASE_DRIVER).newInstance(); DatabaseFactory.getInstance().getConnection().close(); IdFactory _idFactory = IdFactory.getInstance(); if (!_idFactory.isInitialized()) { _log.error("Could not read object IDs from DB. Please Check Your Data."); throw new Exception("Could not initialize the ID factory"); } CacheManager.getInstance(); ThreadPoolManager.getInstance(); LfcDAO.LoadArenas(); LfcStatisticDAO.LoadGlobalStatistics(); LfcStatisticDAO.LoadLocalStatistics(); CustomStatsDAO.LoadCustomValues(); PremiumAccountRatesHolder.loadLists(); BotCheckManager.loadBotQuestions(); FreePremiumAccountsDao.LoadTable(); HidenItemsDAO.LoadAllHiddenItems(); CustomHeroDAO.getInstance(); HWIDBan.getInstance().load(); Scripts.getInstance(); GeoEngine.load(); Strings.reload(); GameTimeController.getInstance(); World.init(); Parsers.parseAll(); ItemsDAO.getInstance(); CrestCache.getInstance(); ImagesCache.getInstance(); CharacterDAO.getInstance(); ClanTable.getInstance(); DailyQuestsManager.EngageSystem(); // FakePlayersTable.getInstance(); SkillTreeTable.getInstance(); SubClassTable.getInstance(); EnchantHPBonusTable.getInstance(); PetSkillsTable.getInstance(); ItemAuctionManager.getInstance(); SpawnManager.getInstance().spawnAll(); FakePlayersSpawnManager.getInstance().spawnAll(); StaticObjectHolder.getInstance().spawnAll(); RaidBossSpawnManager.getInstance(); Scripts.getInstance().init(); ItemHolder.getInstance().initItems(); DimensionalRiftManager.getInstance(); Announcements.getInstance(); LotteryManager.getInstance(); PlayerMessageStack.getInstance(); if (Config.AUTODESTROY_ITEM_AFTER > 0) ItemsAutoDestroy.getInstance(); MonsterRace.getInstance(); if (Config.ENABLE_OLYMPIAD) { Olympiad.load(); Hero.getInstance(); } PetitionManager.getInstance(); CursedWeaponsManager.getInstance(); if (Config.ALLOW_WEDDING) { CoupleManager.getInstance(); } ItemHandler.getInstance(); AdminCommandHandler.getInstance().log(); UserCommandHandler.getInstance().log(); VoicedCommandHandler.getInstance().log(); TaskManager.getInstance(); _log.info("=[Events]========================================="); ResidenceHolder.getInstance().callInit(); EventHolder.getInstance().callInit(); _log.info("=================================================="); BoatHolder.getInstance().spawnAll(); CastleManorManager.getInstance(); Runtime.getRuntime().addShutdownHook(Shutdown.getInstance()); _log.info("IdFactory: Free ObjectID's remaining: " + IdFactory.getInstance().size()); if (Config.ALT_FISH_CHAMPIONSHIP_ENABLED) FishingChampionShipManager.getInstance(); HellboundManager.getInstance(); NaiaTowerManager.getInstance(); NaiaCoreManager.getInstance(); SoDManager.getInstance(); SoIManager.getInstance(); SoHManager.getInstance(); MiniGameScoreManager.getInstance(); CommissionManager.getInstance().init(); WorldStatisticsManager.getInstance(); ArcanManager.getInstance(); ToIManager.getInstance(); ParnassusManager.getInstance(); BaltusManager.getInstance(); Shutdown.getInstance().schedule(Config.RESTART_AT_TIME, Shutdown.RESTART); /* CCP Guard START ccpGuard.Protection.Init(); ** CCP Guard END*/ _log.info("GameServer Started"); _log.info("Maximum Numbers of Connected Players: " + Config.MAXIMUM_ONLINE_USERS); GamePacketHandler gph = new GamePacketHandler(); InetAddress serverAddr = Config.GAMESERVER_HOSTNAME.equalsIgnoreCase("*") ? null : InetAddress.getByName(Config.GAMESERVER_HOSTNAME); _selectorThreads = new ArrayList<SelectorThread<GameClient>>(Config.PORTS_GAME.length); for (int i = 0; i < Config.PORTS_GAME.length; i++) { SelectorThread<GameClient> selectorThread = new SelectorThread<GameClient>(Config.SELECTOR_CONFIG, gph, gph, gph, null); selectorThread.openServerSocket(serverAddr, Config.PORTS_GAME[i]); selectorThread.start(); _selectorThreads.add(i, selectorThread); } AuthServerCommunication.getInstance().start(); if (Config.SERVICES_OFFLINE_TRADE_RESTORE_AFTER_RESTART) ThreadPoolManager.getInstance().schedule(new RestoreOfflineTraders(), 30000L); if (Config.ONLINE_GENERATOR_ENABLED) ThreadPoolManager.getInstance() .scheduleAtFixedRate( new OnlineTxtGenerator(), 5000L, Config.ONLINE_GENERATOR_DELAY * 60 * 1000L); getListeners().onStart(); if (Config.IS_TELNET_ENABLED) statusServer = new TelnetServer(); else _log.info("Telnet server is currently disabled."); _log.info("================================================="); String memUsage = new StringBuilder().append(StatsUtils.getMemUsage()).toString(); for (String line : memUsage.split("\n")) _log.info(line); _log.info("================================================="); }
private OnlinePlayers() { ThreadPoolManager.getInstance() .scheduleGeneral(new AnnounceOnline(), Config.ONLINE_PLAYERS_ANNOUNCE_INTERVAL); }
public Bitmap loadImage( final String imageName, final String imgUrl, final boolean isbusy, final ImageCallback callback) { Bitmap bitmap = null; if (imageCache.containsKey(imgUrl)) { SoftReference<Bitmap> softReference = imageCache.get(imgUrl); bitmap = softReference.get(); if (bitmap != null) { Log.i("m", "从内存获得图片成功。。"); callback.loadImage(bitmap, imgUrl); return bitmap; } } // if(!isbusy){ // 从本地获取图片 bitmap = getBitmapFromData(imageName, mContext); // System.out.println("从本地获取图片"); // } if (bitmap != null) { imageCache.put(imgUrl, new SoftReference<Bitmap>(bitmap)); Log.i("m", "从本地获得图片成功。。"); callback.loadImage(bitmap, imgUrl); return bitmap; } else { // 从网络获取图片 final Handler handler = new Handler() { @Override public void handleMessage(Message msg) { if (msg.obj != null) { synchronized (imageCache) { Map<String, Bitmap> bitmapMap = (Map) msg.obj; for (String str : bitmapMap.keySet()) { mbitmap = bitmapMap.get(str); url = str; imageCache.put(url, new SoftReference<Bitmap>(mbitmap)); } if (android.os.Environment.getExternalStorageState() .equals(android.os.Environment.MEDIA_MOUNTED)) { try { String imageName = url.substring(url.lastIndexOf("/") + 1, url.length()); if (!imageName.endsWith(".jpg") && !imageName.endsWith(".png")) { imageName += ".png"; } String mImagePath = ImageUtil.IMAGE_PATH + imageName; /*if (url.endsWith(".png")) { saveImagePng(mImagePath, mbitmap); } else if (url.endsWith(".jpg")) { saveImageJpeg(mImagePath, mbitmap); }*/ saveBitmapToData(imageName, mbitmap, mContext); // System.out.println("向SD卡获取图片"); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } callback.loadImage(mbitmap, url); } } } }; getImageRunnable run = new getImageRunnable(imgUrl, handler, callback); ThreadPoolManager.getInstance().addTask(run); } return bitmap; }