[Java/Android] Thread를 이용한 특정 작업 수행하기

안드로이드에서 비동기로 특정 작업을 처리하기 위해 간편하게 사용할 수 있는 것으로 AsyncTask가 있습니다. 하지만 그것 이전에 어디서든지 사용할 수 있는 Thread를 이용한 방법에 대해 간단히 정리해 보도록 하겠습니다.

여기서 주의할 점은 처리가 끝나는 시점에서 UI를 변경한다거나 하는 것을 핸들러를 이용하여 처리하는 부분인데요 안드로이드에서는 메인 쓰레드 이외에서 UI에 영향을 끼치는 행위를 거부하고 있습니다. 그렇기 때문에 핸들러를 이용하여 처리를 합니다.

[code]public class ThreadDownloadActivity extends Activity implements OnClickListener
{
    private ProgressDialog mPdProgress;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        // 상태 표시용 프로그래스바
        mPdProgress = new ProgressDialog(this);
        mPdProgress.setMessage(“작업을 수행중입니다.”);
        mPdProgress.setIndeterminate(true);
        mPdProgress.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        mPdProgress.setCancelable(false);
       
        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(this);
    }
   
  // 이미지 다운로드 결과 표시용 핸들러
    final Handler handler = new Handler()
    {
    public void handleMessage(Message msg)
    {
    mPdProgress.dismiss();
    String message = null;
    switch(msg.what)
    {
case 0:
message = “수행 완료”;
break;

default:
message = “수행 실패”;
break;
}
   
    // 메시지 출력
    Toast.makeText(ThreadDownloadActivity.this, message, Toast.LENGTH_SHORT).show();
    }
    };

@Override
public void onClick(View v)
{
mPdProgress.show();

// 이미지 저장용 쓰레드
   Thread thread = new Thread(new Runnable()
   {
            public void run()
            {
        try
        {
        // 특정 작업을 수행
        // 원래는 이미지 다운로드를 구현해 보려 하였지만 포기;;
        Thread.sleep(2000);
        handler.sendEmptyMessage(0);
        }
        catch(Exception e)
        {
        // 작업이 실패 시
        handler.sendEmptyMessage(1);
        }
            }
        });
        thread.start();
}
}[/code]
위와 같은 코드를 수행해 보면 다음과 같이 잘 동작하는 것을 확인할 수 있습니다.
사용자 삽입 이미지1359710808.zip

[Java] DOM파서를 이용한 XML 파일 생성하기

Java에는 다양한 XML 파서를 이용할 수 있습니다. 그중에 DOM이 가장 직관적이고 쉬운 방법으로 XML을 처리할 수 있지 않을까 생각됩니다. DOM을 이용하여 XML을 생성하기 위해서는 기본적으로 모든 XML의 내용을 정의할 수 있는 Document를 생성해야 하는데요 이것을 생성하기 위해 DocumentBuilder 클래스를 사용합니다.

마지막으로 만들어진 XML 엘리먼트 노드들이 연결된 Document를 가지고 XML 파일을 생성하는데 이때에 Transformer 클래스를 사용합니다.

DOM Parser 결과물

이 예제를 수행하게 되면 다음의 같은 내용을 가진 file.xml 파일이 생성됩니다.
[code]<?xml version=”1.0″ encoding=”UTF-8″ standalone=”no” ?>
<company>
<staff id=”1″>
<firstname>Gildong</firstname>
<lastname>Hong</lastname>
<nickname>Mr.Hong</nickname>
<salary>100000</salary>
</staff>
</company>[/code]

Java 클래스 소스

[code]try
{
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();

// 루트 엘리먼트
Document doc = docBuilder.newDocument();
Element rootElement = doc.createElement(“company”);
doc.appendChild(rootElement);

// staff 엘리먼트
Element staff = doc.createElement(“Staff”);
rootElement.appendChild(staff);

// 속성값 정의
Attr attr = doc.createAttribute(“id”);
attr.setValue(“1”);
staff.setAttributeNode(attr);

// 속성값을 정의하는 더 쉬운 방법
// staff.setAttribute(“id”, “1”);

// firstname 엘리먼트
Element firstname = doc.createElement(“firstname”);
firstname.appendChild(doc.createTextNode(“Gildong”));
staff.appendChild(firstname);

// lastname 엘리먼트
Element lastname = doc.createElement(“lastname”);
lastname.appendChild(doc.createTextNode(“Hong”));
staff.appendChild(lastname);

// nickname 엘리먼트
Element nickname = doc.createElement(“nickname”);
nickname.appendChild(doc.createTextNode(“Mr.Hong”));
staff.appendChild(nickname);

// salary 엘리먼트
Element salary = doc.createElement(“salary”);
salary.appendChild(doc.createTextNode(“100000”));
staff.appendChild(salary);

// XML 파일로 쓰기
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();

transformer.setOutputProperty(OutputKeys.ENCODING, “UTF-8”);
transformer.setOutputProperty(OutputKeys.INDENT, “yes”); DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(new FileOutputStream(new File(“C:\\file.xml”)));

// 파일로 쓰지 않고 콘솔에 찍어보고 싶을 경우 다음을 사용 (디버깅용)
// StreamResult result = new StreamResult(System.out);

transformer.transform(source, result);

System.out.println(“File saved!”);
}
catch (ParserConfigurationException pce)
{
pce.printStackTrace();
}
catch (TransformerException tfe)
{
tfe.printStackTrace();
}[/code]