AndroidでのUIと時間のかかる操作の分離


Android携帯電話の開発をしたことがある人は、携帯電話UIが単独のスレッドで実行されていることを知っています.このスレッドはユーザーの操作でブロックされないほうがいいです.言い換えれば、ユーザの操作に数十秒または数十分かかる場合、UIスレッドをこの時間内に占有することは非常に賢明ではない.UIスレッドをブロックし、携帯電話が表示されなくなったり、ユーザーの新しい操作を受け入れたりして、ユーザーにハングアップの感じを与えます.
したがって、最良の方法は、ユーザが時間を費やした操作を別のスレッドに配置し、傍受者モードで操作の完了を傍受することである.例えば、携帯電話サービスはhttpプロトコルを通じてサーバと通信を確立し、この通信が携帯電話の他の機能の表示をブロックしないようにするために、新しいスレッドを開いてデータを伝送する必要があり、データの伝送が完了すると、傍受者のコールバック関数を呼び出し、結果をハンドスクリーンに表示する.ここでは、UIと時間のかかる操作を分離する方法について説明します.
 
複雑な操作ごとにTaskとして抽象化する必要があります.
//    BaseTask  ,  taskParameter              
// execute()           
public abstract class BaseTask {	Object  taskParameter; 
	abstract Object execute() throws Exception;
}      ,     :public class AsynMethodTask extends BaseTask {

	public AsynMethodTask(AsynMethodTaskParameter taskParameter) {
		this.taskParameter = taskParameter;
	}

	//  execute  ,     Java   Method ,instance       , methodName        ,methodParameter        
	@Override
	public Object execute() throws Exception {
		AsynMethodTaskParameter parameters = (AsynMethodTaskParameter) this.taskParameter;
		Method method = MethodHelper.getMethod(parameters.instance,
				parameters.methodName, parameters.methodParameters);
		if (method != null) {			
				return method.invoke(parameters.instance,
						parameters.methodParameters);			
		}
		return null;
	}
	//    ,    Task   
	public static AsynMethodTask CreateTask(Object instance, String methodName,
			Object... parameters) {
		return new AsynMethodTask(new AsynMethodTaskParameter(instance,
				methodName, parameters));
	}
}

AsynMethodTaskParameterは次のように定義されています.
public class AsynMethodTaskParameter{
 public Object instance;
 public String methodName;
 public Object[] methodParameters;
 public AsynMethodTaskParameter (Object instance , String methodName,Object[] methodParameters )
 {
	 this.instance = instance;
	 this.methodName = methodName;
	 this.methodParameters = methodParameters;
 }
}

このように、基本的なTASKメソッドが実装されていますが、どのように使用しますか?リクエストを送信し、taskを非同期で有効にするRequestクラスが必要です.
public class Request extends AsyncTask<RequestParameter, Integer, Object> {

	private RequestListener emmaRequestListener = null;
	private Object data = null;
	private Exception _errorException = null;

	//       TASK,AsyncTask       ,           
	@Override
	protected Object doInBackground(RequestParameter... parameter) {
		try {
			RequestParameter emmaRequestParameter = parameter[0];
			emmaRequestListener = emmaRequestParameter.requestListener;
			data = emmaRequestParameter.data;

			BaseTask task = emmaRequestParameter.task;
			return task.execute();
		}	
		catch (InvocationTargetException e) {
			Throwable baseException = e.getCause() ;
			if (baseException == null)
				_errorException = new LocalGeneralException(e.getMessage());	
			else {
				if (baseException instanceof ServerGeneralException)
				{
					_errorException = new ServerGeneralException(baseException.getMessage());
				}
				else if (baseException instanceof ServerAuthException)
				{
					_errorException = new ServerAuthException(baseException.getMessage());
				}
				else {					
					_errorException = new LocalGeneralException(baseException.getMessage());
				}
			}
		}
		catch (Exception e) {
			_errorException = new LocalGeneralException(e.getMessage());
		}
		return _errorException;
		
	}
		//     ,      ,       
	@Override
	protected void onPostExecute(Object result) {
		if (_errorException == null) {
			emmaRequestListener.onRequestSuccess(result, data);
		} else {
			emmaRequestListener.onRequestFailed(_errorException, data);			
		}
	}
	//     cancel 
	@Override
	protected void onCancelled() {
		emmaRequestListener.onRequestCanceled(data);
	}

	public interface RequestListener {
		void onRequestSuccess(Object result, Object data);

		void onRequestFailed(Object result, Object data);
		
//		void onRequestCanceled(Object data);
	}

	//      ,    task,       RequestListener      
	public static Request executeAsynRequest(BaseTask task,
			RequestListener requestListener, Object data) {
		RequestParameter requestParameter = new RequestParameter(task,
				requestListener, data);
		Request r = new Request();
		r.execute(requestParameter);
		
		return r;
	}
}

最後にMethodの名前を定義するだけです.
public final static class Methods
	{
		public static String getProfileView = "getProfileView";
		public static String uploadProfileView = "uploadProfileView";
		public static String getUserProfile = "getUserProfile";
        }

正常に呼び出すことができます.
AsynMethodTask task = AsynMethodTask.CreateTask(profileModel, ProfileModel.Methods.uploadProfileView, profileUploadData);
Request.executeAsynRequest(task, this, TASK_UPLOAD_PROFILE);

全体の過程はかなり簡単で、最も重要なのは観察者モードとAsyncTaskクラスの運行方式を熟知して、その中のコールバック関数を再ロードして、私たちの任務をバックグラウンドで運行させます.返される値はObjectオブジェクトで、強制タイプで必要な値に変換する必要があります.伝達されるパラメータは、無制限数のパラメータで伝達することができる.