현재 Android 애플리케이션을 개발하기 시작했으며 모든 것이 매우 간단하고 직관적이라고 나와 있습니다.알림이 포함 된 Android AsyncTask
AsyncTask에 대한 질문이 있습니다. 어쩌면 내가 잘못한 것을했을 수도 있지만 여기 상황이 있습니다.
웹에서 목록의 콘텐츠를로드해야하는 작은 앱이 있습니다. 가짜 요청을 기반으로 모든 것을 개발했으며 모두 훌륭했습니다. 그런 다음 실제 요청으로 코드를 업데이트하고 'Network on main thread error'를 받았습니다. 그래서 AsyncTask로 전환하기로 결정했습니다.
AsyncTask에 비동기 작업을시키고 다른 곳에서 결과를 처리 할 수 있는지 궁금합니다. (실제로 GUI 연결과 모든 것이 있습니다). 가독성과 논리면에서 Activity의 인터페이스를 처리하는 모든 코드를 보유하는 것이 더 합리적이라고 생각했지만 작업 완료 시점을 어떻게 알 수 있습니까?
나는이 간단한 클래스와 인터페이스를 작성했지만 작동하는 데 좋은 방법인지 또는 더 좋은 방법이 있는지 알고 싶었습니다.
public interface AsyncDelegate {
public void executionFinished(LazyLoaderWithDelegate lazyLoaderWithDelegate);
}
이 간단한 인터페이스 :
그래서, 여기에 코드입니다. 그 목적은 Activity가 이것을 구현하고 'executionFinished'메소드를 처리하는 것입니다. 청취자와 같은 것.
import android.os.AsyncTask;
public class LazyLoaderWithDelegate<Params, Progress, Result> extends AsyncTask<Params, Progress, Result>{
AsyncDelegate delegate;
Result result;
public LazyLoaderWithDelegate(AsyncDelegate delegate){
this.delegate = delegate;
}
@Override
protected Result doInBackground(Object... params) {
//This will be Overridden again from the subclasses anyway.
return null;
}
@Override
protected void onPostExecute(Result r){
this.result = r;
delegate.executionFinished(this);
}
public Result getResult(){
return result;
}
}
이 클래스는 기본적으로 작업이 완료되면 대리인에게 알리기 위해 스켈레톤 구조를 제공합니다.
그게 전부입니다. 다음은이 클래스를 사용하는 예는 다음과 같습니다 당신이 onPostExecute
에서 실행
public class LazyVideoLoader extends LazyLoaderWithDelegate<Void, Void, List<List<Video>>>{
public LazyVideoLoader(AsyncDelegate delegate) {
super(delegate);
}
@Override
protected List<Video> doInBackground(Void ...params) {
return ServerInterface.getVideos();
}
}
public class MainActivity extends Activity implements AsyncDelegate {
private LazyVideoLoader videoLoader;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/*
* Set up the lazy loaders
*/
videoLoader = new LazyVideoLoader(this);
videoLoader.execute();
}
@Override
public void executionFinished(LazyLoaderWithDelegate task) {
if(task == videoLoader){
List<Video> result = videoLoader.getResult();
//Do whatever you need...
}
}
'onPostExecute'에서 실행되는 모든 것은 UI 스레드에 있습니다. – Cornholio
UI 변경을 위해 publishProgress 또는 onProgressUpdate (AsyncTask의 메소드)를 사용할 수도 있습니다. http://developer.android.com/reference/android/os/AsyncTask.html –