체인식 비동기 퀘스트류, 미혹의 축소 해결

2554 단어 Android경험 소감
V층의 친구들은 비동기적인 임무를 수행하는 각종 리셋과runOnUIthread가 미혹되어 축소되었다고 불평해 왔다. 코드를 다 쓴 사람은 하느님과 자신만 무슨 뜻인지 알고 3일 후에 하느님만 무슨 뜻인지 알고 있다.
어떤 구조가 체인식으로 여러 가지 점을 찍을 수 있는지 듣고 이 모델을 생각해 봤는데 실현하기 어렵지 않다고 생각해서 직접 체인식으로 비동기적인 임무를 썼다. 그리고 수시로 UI라인으로 되돌아갈 수 있고 다시 UI라인으로 되돌아갈 수 있다. 다시 UI라인으로 되돌아갈 수 있고 다시 UI라인으로 되돌아갈 수 있다. 쿠쿠, 방금 메모장으로 썼는데 뛸 수 있을지 모르겠다.내일 시험부터 붙여.
public class AsyncTask{
	private String TAG = "AsyncTask";
	private Thread thread;
	private ArrayList tasks;
	private MyRunnable mRunnable;
	private Activity activity;
	private ProgressListener listener;
	private int taskCount;
	
	private AsyncTask(Activity activity){
		this.mRunnable = new MyRunnable();
		this.tasks = new ArrayList<>();
		this.activity = activity;
	}
	
	public static AsyncTask getInstance(Activity activity){
		return new AsyncTask(activity);
	}
	
	public AsynoTask setProgressListener(ProgressListener listener){
		this.listener = listener;
		return this;
	}
	
	public AsynoTask doAsync(Task task){
		this.tasks.add(task.setRunOnUiThread(fasle));
		return this;
	}
	
	public AsyncTask doUI(Task task){
		this.tasks.add(task.setRunOnUiThread(true));
		return this;
	}
	
	public void start(){
		this.thread = new Thread(runnable).start();
	}
	
	class MyRunnable implements Runnable{
		@Override
		public void run(){
			taskCount = tasks.size();
			for(int i = 0; i < taskCount; i++){
				Task task = tasks.get(i);
				if(task == null){
					continue;
				}
				if(task.runOnUiThread && activity != null){
					activity.runOnUiThread(task);
				}else{
					task.run();
				}
				if(listener != null){
					listener.at(taskCount, i);
				}
			}
		}
	}
	
	/**
	 *    ,  Runnable  ,       
	 */
	public abstract class Task implements Runnable{
		public boolean runOnUiThread;
		Task setRunOnUiThread(boolean b){
			this.runOnUiThread = b;
			return this;
		}
	}
	
	public interface ProgressListener{
		void at(int taskCount, int done);
	}
	
}

뛸 수 있을 것 같은데, 한 가지 불분명한 것은activity를 실행하고 있다는 것이다.runOnUiThread(task) 이후 바로 다음 라운드 순환에 들어갈지 여부, 고수가 있다면 바로잡아 주세요.
구체적인 용법은 분명히 볼 수 있을 것이니, 위조 코드를 써서 간단하게 표시해라
AsyncTask.getInstance(activity)
.setProgressListener(new ProgressListener(){
    public void at(int taskCount, int done){
        //do something
    }
})
.doAsync(new Task(){
    public void run(){
        //do something
    }
})
.doUI(new Task(){//  })
.doAsync(new Task(){//  })
.doUI(new Task(){//  })
.start();

만약 이 종류가 정상적으로 뛸 수 있다면 후기에 다른 상태 감청 방법을 보완해야 한다. 예를 들어 onAllTaskFinished() 등이다.

좋은 웹페이지 즐겨찾기