SSISO Community

시소당

자바클래스중에 MediaTracker 에 대해서 설명 부탁드려요~

import  java.awt.MediaTracker;
import  java.awt.Image;
import  java.applet.Applet;
import  java.net.URL;

public  class  ImageLoader  implements  Runnable  {

private  static  ImageLoader  m_this;
private  Hashtable  m_images;
private  MediaTracker  m_tracker;
private  int  m_nTotal;
private  int  m_nLoaded;
private  Thread  m_thread;

private  ImageLoader  ()  {
m_images  =  new  Hashtable  ();
}

//  Get  instance
public  static  ImageLoader  getInstance  ()  {
if  (m_this  ==  null)  {
m_this  =  new  ImageLoader  ();
}

return  m_this;
}

//  Load  images
public  void  load  (Applet  applet,  URL  url,  String  dir,  String  []  name)  {
m_tracker  =  new  MediaTracker  (applet);
m_nTotal  =  name.length;
m_nLoaded  =  0;

Image  img  =  null;
for  (int  i  =  0;  i  <  m_nTotal;  i  ++)  {
img  =  applet.getImage  (url,  dir  +  "/"  +  name  [i]);
m_tracker.addImage  (img,  i);

m_images.put  (name  [i],  img);
}

m_thread  =  new  Thread  (this);
m_thread.start  ();
}

//  Get  Image
public  Image  getImage  (String  name)  {
return  (Image)  m_images.get  (name);
}

//  Get  loading  rate
public  int  getLoadRate  ()  {
return  (int)  (100  *  m_nLoaded  /  m_nTotal);
}

//  run  ()
public  void  run  ()  {

for  (int  i  =  0;  i  <  m_nTotal;  i  ++)  {
try  {
m_tracker.waitForID  (i);
}  catch  (InterruptedException  e)  {

}  //  End  of  try-catch
while  ((m_tracker.statusID  (i,  true)  &  MediaTracker.COMPLETE)  ==  0)  {}

m_nLoaded  ++;

try  {
Thread.sleep  (50);
}  catch  (InterruptedException  e)  {

}  //  End  of  try-catch
}  //  End  of  for  (i)

}  //  End  of  run  ()
}  //  End  of  ImageLoader  class



















MediaTracker  class  는  각종  미디어(AudioClip,  Image)의  상태를  추적하고  감시하는  기능을  가진  유틸리티  클래스입니다.

MediaTracker객체  생성시  미디어가  출력될  컴퍼넌트  객체를  인수로  넘겨  주어야  추적  대상이  되구요,  말  그대로.  미디어를  추적하는  것으로서  이미지  로딩의  상태를  추적할  수  있는  방법들을  제공합니다.

이  클래스를  사용하면  필요한  이미지들을  쉽게  다운로드  받을수  있고,  이미지들이  모두  로딩되는  시점을  알수  있습니다.

그러니가.서버에서  이미지를  다운  받아서  그려지게  될때.  이  클래스를  사용하게  되면  다운로드가  되기전에  그려지는(이미지의  일부분만  그려지는..)  문제점이  해결되는  것입니다.

게임에서  사용되는  모든  이미지들을  다운로드하고  로딩한후에  사용할  수가  있습니다.^^


-----------------------------------------------------------------------------------------------------





MediaTracker  를  사용하는  경우는  대부분  애플릿에서  사용을  하구요,
애플릿은  클라이언트의  브라우저에서  실행되죠.

그런데  지도애플릿이  있어서  아주  큰  이미지를  읽어들어야  한다면
Mediatracker  를  사용해야  합니다.

사용  안하면  어떻게  되는가?

애플릿은  서버로부터  이미지가  제대로  로딩됐는지  확인도  안하고
그냥  자기  할일을  계속  해버립니다.

  

이미지가  없어서  못받은  건지,  아니면  받다가  삑사리가  나서  깨진건지,

  

그것도  아니면  너무  커서  시간이  더  필요한  건지....

이딴거  생각하지도  않고  애플릿이  실행되어  버리니까

이미지가  안나오는  경우가  발생합니다.  

이미지가  작으면  다행스럽게도  보일  수가  있는데(시간이  적게  걸리니까)  1  메가만  넘어도  아마  백발백중  실패하게  됩니다.
  

for  (int  i  =  0;  i  <  m_nTotal;  i  ++)  {
        try  {
                m_tracker.waitForID  (i);
        }  catch  (InterruptedException  e)  {}  //  End  of  try-catch
        while  ((m_tracker.statusID  (i,  true)  &  MediaTracker.COMPLETE)  ==  0)  {}

        m_nLoaded  ++;
        try  {
                Thread.sleep  (50);
        }  catch  (InterruptedException  e)  {}  //  End  of  try-catch
}  //  End  of  for  (i)

  

  

여기서  m_tracker.waitForID  (i);  이부분이  i  번째  이미지를  기다리는  겁니다.

  

그리고  while  문에서  잘  로딩되었는지를  확인해서  이상이  없으면

로딩된  숫자를  하나  증가시키는  거죠...

  

선사에서  이  클래스를  개발  할때는  이미지  뿐만  아니라  사운드나  기타  다른  파일까지도  통합하겠다고  했는데  아직까지도  이미지만  가능한  것  같아요...

902 view

4.0 stars