티스토리 뷰

[원본-일문] http://blog.nkzn.net/entry/20120113/1326478800 변역기 번역본.

시대는 AsyncTask보다 AsyncTaskLoader 
http://archive.guma.jp/2011/11/-asynctask-asynctaskloader.html

아무래도 시대는 AsyncTaskLoader 같습니다.
android-support-v4.jar에 있으므로 Android 1.6 이상에서 사용할 수 있으며,
간단한것 같습니다. 일단 사용해보기로합시다.

AsyncTaskLoader | 안드로이드 Developers 
http://developer.android.com/reference/android/content/AsyncTaskLoader.html

어디부터 어디까지가 AsyncTaskLoader 사용 처리인지 모르겠습니다.

AsyncTask 간단한 예로 @vvakame 의 JsonPullParser의 Android 버전 샘플에 주목 해보십시오.

jsonpullparser-android-sample
https://github.com/vvakame/JsonPullParser/tree/master/jsonpullparser-android-sample

HTTP에서 입수해온 JSON을 성형하여 ListView에 표시 할뿐. 알기 쉽다. AsyncTask 잘 모르는 저도 방향을 잡을 수 있었습니다.
이를 참고로하면서 AsyncTaskLoader 구현한 것이 다음입니다. 
List형에서 데이터를 읽어 오는것을 구현했습니다.

MainActivity. java

package net.nkzn.android.sample.asynctaskloader;

import Java.util.List;

import android.os.Bundle;
 import android.support.v4.app.FragmentActivity;
 import android.support.v4.app.LoaderManager.LoaderCallbacks;
 import android.support.v4.content.Loader;
 import android.widget.ArrayAdapter;
 import android.widget.ListView;

public class MainActivity extends FragmentActivity Implements LoaderCallbacks<List<String>> {
	
	ArrayAdapter<String> mAdapter;

	@ Override 
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        // 결과 표시 용
		ListView listView = (ListView) findViewById(R.id.listview);
		mAdapter = New ArrayAdapter<String>(this , android.R.layout.simple_list_item_1);
		listView.setAdapter(mAdapter);

		// 로더를 초기화 
		Bundle args = New Bundle( 1 ); // onCreateLoader에 넘겨 줄 값은 여기에 
		getSupportLoaderManager().initLoader( 0 , args, this );
    }

	/ ** 
	 * 로더를 초기화 할 때 불린다.
	 * (이번 예라고 onCreate에서 초기화) 
	 * / 
	@ Override 
	public Loader<List<String>> onCreateLoader(int ID, Bundle args) {
		 // 객체 만들어 전달하고 
		StringsDownloadTaskLoader loader = New StringsDownloadTaskLoader(getApplication());
		loader.forceLoad(); // 이제로드가 시작된다. AsyncTaskLoader # onStartLoading에 구현하는 것도 가능. 
		return loader;
	}

	/ ** 
	 * 데이터 로딩이 완료 될 때 불리는 
	 * @ param data AsyncTaskLoader # loadInBackground에서 반환 값 
	 * / 
	@ Override 
	public void onLoadFinished(Loader<List<String>> loader, List<String> data) {
		 for(String s : data) {
			mAdapter.add(s);
		}
		mAdapter.notifyDataSetChanged();
	}

	/ ** 
	 * 잘 와칸네 
	 * / 
	@ Override 
	public void onLoaderReset(Loader<List<String>> loader) {
		 // TODO Auto-generated method stub
		
	}
}

StringsDownloadTaskLoader. java

package net.nkzn.android.sample.asynctaskloader;

import Java.util.ArrayList ;
import Java.util.List;

import android.content.Context;
import android.support.v4.content.AsyncTaskLoader;

public class StringsDownloadTaskLoader extends AsyncTaskLoader<List<String>> {

	/ ** 
	 * 생성자. 
	 * super (Context)를 실행할 수 분 생성자의 인수는 뭐든지 OK.
	 * 이 예제에서는 MainActivity # onCreateLoader에서 호출됩니다.
	 * / 
	public StringsDownloadTaskLoader(Context context) {
		 super(context);
	}

	/ ** 
	 * 백그라운드 처리하고 싶은 것.
	 * 파라미터 지정 형식으로 데이터를 반환해야한다.
	 * / 
	@ Override 
	public List<String> loadInBackground () {
		
		List<String> strings = New ArrayList<String>();

		try {
			Thread.sleep( 500 ); // 데이터 읽기 대신 
			strings.add("hogehoge");
			strings.add("hugahuga");
		} catch(InterruptedException e) {
			 // TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return Strings;
	}
	
}


개인적 정리

  1. Web의 작은 파일이 필요할 때 스레드 관리의 번거 로움에서 해방.
  2. Activity / Fragment에서 분리 할 때문에 코드가 깨끗.
  3. AsyncTask나 Thread 관리를 기억할 부담에서 일시적으로 해방.

댓글