此封装后为一个抽象类LoadingDialog<Input, Result>,使用方法为:
1.写一个类继承该抽象类.(可以使用与LoadingDialog相同的传入参数)
2.重写doInBackground实现加载对话框弹出后,后台完成的具体业务逻辑(此方法运行在子线程).如果想增加进度条,可以改写LoadingDialogonProgressUpdate()来实现.
3.重写doStuffWithResult来操作doInBackground中获得的结果.(此方法运行在UI线程)
代码如下:
package uk.ac.essex.musicplayer.dialog;
import uk.ac.essex.musicplayer.api.WSError;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.os.AsyncTask;
import android.widget.Toast;
public abstract class LoadingDialog<Input, Result> extends AsyncTask<Input, WSError, Result> {
private ProgressDialog mProgressDialog;
/**
* 相当于传入Context
*/
protected Activity mActivity;
/**
* 加载时的提示信息
*/
private int mLoadingMsg;
/**
* 加载失败的提示信息
*/
private int mFailMsg;
public LoadingDialog(Activity activity, int loadingMsg, int failMsg) {
this.mActivity = activity;
this.mLoadingMsg = loadingMsg;
this.mFailMsg = failMsg;
}
@Override
public void onCancelled() {
failMsg();
super.onCancelled();
}
@Override
public void onPreExecute() {
String title = "";
String message = mActivity.getString(mLoadingMsg);
mProgressDialog = ProgressDialog.show(mActivity, title, message, true, true, new OnCancelListener() {
public void onCancel(DialogInterface dialogInterface) {
LoadingDialog.this.cancel(true);
}
});
super.onPreExecute();
}
/**
* 子类重写该方法来实现对话框弹出时,后台执行的具体的业务逻辑
*/
@Override
public abstract Result doInBackground(Input... params);
@Override
public void onPostExecute(Result result) {
super.onPostExecute(result);
mProgressDialog.dismiss();
if (result != null) {
doStuffWithResult(result);
} else {
failMsg();
}
}
protected void failMsg() {
Toast.makeText(mActivity, mFailMsg, 2000).show();
}
/**
* 当结果不为空时所调用的方法,子类重写该方法来处理结果
*
* @param result
* @return
*/
public abstract void doStuffWithResult(Result result);
/**
* 后台doInBackground中出现异常时,调用publishProgress()方法,该方法会
* 激活调用此方法,显示异常信息
*/
@Override
protected void onProgressUpdate(WSError... values) {
Toast.makeText(mActivity, values[0].getMessage(), Toast.LENGTH_LONG).show();
this.cancel(true);
mProgressDialog.dismiss();
super.onProgressUpdate(values);
}
}
WSError类代码如下:
package uk.ac.essex.musicplayer.api;
public class WSError extends Throwable {
private static final long serialVersionUID = 1L;
private String message;
public void setMessage(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
}