我目前有一个UserFunctions类可以执行我的所有用户操作,例如注册,登录等。在UserFunctions类中,有一个JSONParser对象,它执行所有实际的HTTP调用并返回JSONObject。
public class UserFunctions {
private JSONParser jsonParser;
private static String registerURL = Constants.registerUrl;
// constructor
public UserFunctions(){
jsonParser = new JSONParser();
}
public JSONObject register(){
// getting JSON Object
JSONObject json = jsonParser.getJSONFromUrl(registerURL);
// return json
return json;
}
...
}
然后在我的活动类的事件处理程序中,我只做UserFunctions.register()。
我的问题是,我现在想在后台线程中执行所有这些调用,同时显示ProgressDialog。我知道在后台运行线程是通过AsyncTask实现的。
但是我应该如何实现这个设计,以便我仍然可以在我的Activity类中执行UserFunctions.register(),所有操作都在后台线程和progressDialog中完成。
答案 0 :(得分:1)
这对你有帮助吗?
@Override
public void onCreate(Bundle savedInstanceState) {
new MyAsyncTask(this).execute();
}
privateclass MyAsyncTask extends AsyncTask<String, Void, Boolean> {
private ProgressDialog dialog;
private Context context;
public ProgressTask(Context context) {
this.context= context;
dialog = new ProgressDialog(context);
}
protected void onPreExecute() {
this.dialog.setMessage("Progress start");
this.dialog.show();
}
protected void onPostExecute(final Boolean success) {
if (dialog.isShowing()) {
dialog.dismiss();
}
}
protected Boolean doInBackground(final String... args) {
// do you registering or whether here
// in this model you can return a boolean to the PostExecute.
}
}
答案 1 :(得分:1)
执行以下操作:
1)在活动类中声明对话框,如下所示:
ProgressDialog dialog;
2)然后声明AsyncTask如下:
private class RegisterUser extends AsyncTask<String,Integer,String>{
String nessage="";
@Override
protected void onPreExecute(){
dialog = ProgressDialog.show(context, "Registering user",
"Please wait.....");
}
@Override
protected String doInBackground(String... params) {
// provide yourcode to register the user then return message
return message="you are registered";
}
protected void onPostExecute(String result) {
dialog.dismiss();
if (result.equlas("you are resgisted"))
// optinal if you want to do as below
// do something here showing toast or any thing of your prefreance
}
}
答案 2 :(得分:1)
好的,进度对话框和异步任务分为两部分,您需要将JSONparser移动到实际的异步任务中。如果要使用多个进度对话框,只需在调用asynctask之前调用它们,并在返回时关闭它们
private class JsonRetriever extends AsyncTask<Url, Void, JSONObject>{
private JSONParser jsonParser;
private ProgressDialog dialog;
public JsonRetriever(Context c){
dialog= new ProgressDialog(c);
jsonParser= new JSONParser();
}
protected void onPreExecute() {
dialog.setMessage("Starting retrieval");
dialog.show();
}
protected JSONObject doInBackground(Url... params) {
try{
return jsonParser.getJSONFromUrl(params[0]);
}catch(Exception e){
return false;
}
return true;
}
protected void onPostExecute(final JSONObject success) {
if (dialog.isShowing()) {
dialog.dismiss();
}
}
}
然后打电话给这只做
public JSONObject register(){
return new JSONRetriever(this).execute(registerURL).get();
}
答案 3 :(得分:0)
从AsyncTask-Class查看publishProgress()
,我认为您正在寻找它。
当Background-Thread完成一些工作时,此方法用于更新UI。您可以在doInBackground()
- 方法。