4

我试图在后台做一个简单的任务,并在完成时显示一个进度条。

这是主要(也是唯一)活动的代码:

public class Login extends Activity {

    public static ProgressDialog progressDialog;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        (...)
        this.getWindow().requestFeature(Window.FEATURE_PROGRESS);
        this.getWindow().setFeatureInt(Window.FEATURE_PROGRESS, Window.PROGRESS_VISIBILITY_ON);
        progressDialog = new ProgressDialog(activity); 
        progressDialog.setMessage("Sending data...");
        progressDialog.setCancelable(false);
        (...)
             // In some onClick Eevent..
             JSONObject result = new Urltasks().execute(...).get();
        (...)

    }
}

这是活动的代码:

class Urltasks extends AsyncTask<String, Integer, JSONObject>{

    protected void onPreExecute()  {
        System.out.println("Inicia onPreExecute");
        Login.progressDialog.show();
    }

    protected void onPostExecute(String result) {
        Login.progressDialog.dismiss();
    }

    protected JSONObject doInBackground(String... arg0) {
             // Some work being done. I do not use Login.progressDialog here
    }
}

使用此代码,ProgressDialog 在任务结束时显示,并且不会关闭。

4

3 回答 3

3

问题在这里:

JSONObject result = new Urltasks().execute(...).get();

调用get()anAsyncTask会阻塞当前线程,即您的 UI 线程,直到执行 AsyncTask。因此进度对话框无法运行。删除get().

要获取 AsyncTask 的结果,您可以例如将侦听器回调传递给 asynctask,当结果可用时收到通知:

class YourAsyncTask extends AsyncTask<ParamType, ProgressType, ResultType> {

  private YourResultListener mListener;

  interface YourResultListener {
    void onResultAvailable(ResultType result);
  }

  YourAsyncTask(YourResultListener listener) {
    mListener = listener;
  }

  @Override protected ResultType doInBackground(ParamType... params) {
    //...
  }

  @Override protected void onPostExecute(ResultType result) {
    mListener.onResultAvailable(result);
  }
}

你可以像这样使用它:

mProgressDialog.show();
new YourAsyncTask(new YourResultListener() {
    @Override void onResultAvailable(ResultType result) {
      mProgressDialog.dismiss();
      // use result
    }).execute(params);

就我个人而言,我喜欢将用户界面元素(例如进度对话框)与异步任务分离。

于 2013-07-31T08:20:27.383 回答
0

在发送调用类的上下文的 Urltasks 中创建构造函数。然后使用该上下文在 Urltasks 的 preExecute 中创建进度对话框

class Urltasks extends AsyncTask<String, Integer, JSONObject>{
Context mContext;
public static ProgressDialog progressDialog;

public UrlTasks(Context c){
   mContext=c;
}
protected void onPreExecute()  {
    progressDialog = new ProgressDialog(mContext); 
    progressDialog.setMessage("Sending data...");
    progressDialog.setCancelable(false);
    progressDialog.show();
}

protected void onPostExecute(String result) {
    progressDialog.dismiss();
}

protected JSONObject doInBackground(String... arg0) {
         // Do your work here
}

}

于 2013-07-31T08:02:17.083 回答
0

不要将您的进度对话框放在您的登录课程中。将其保存在异步任务中

这就是您显示对话框的方式

     progressDialog = ProgressDialog.show(yourActivityHERE.this, "",
    "Loading... please wait.");

为你编辑了这个:

class Urls extends AsyncTask<String, Integer, JSONObject>{

ProgressDialog progressDialog;

protected void onPreExecute()  {

     progressDialog = ProgressDialog.show(yourActivityHERE.this, "",
    "Loading... please wait.");

}

protected void onPostExecute(String result) {
   progressDialog.dismiss();
}

protected JSONObject doInBackground(String... arg0) {
         // Some work being done. I do not use Login.progressDialog here
}
}
于 2013-07-24T20:49:23.317 回答