我是Android的新手,面对进度对话框上的问题,虽然无数的问题和答案都在这里,但没有一个对我有用。任何帮助将不胜感激。 我想在app的登录页面上显示一个旋转轮,所有我的Async Task激活都在不同的类中,我将活动参考传递给处理Async Task的HttpClientHelper类。当我点击Login按钮时,会出现进度对话框。 大多数答案都提到在Activity类中实现Async Task,但我创建了一个在后台处理POST / GET的实用程序类。 因此在瘦非活动类中我没有Context的引用,所以我在HttpClientHelper构造函数中传递了LoginActivity.this。 我在这里做错了。由于多次使用POST / Get我可以在每个活动中实现它们。 请查找示例文件这些不是我发布步骤的实际代码
public class LoginActivity extends AppCompatActivity {
btnSignIn.setOnClickListener(new View.OnClickListener() {
HttpClientHelper httpClientHelper = new HttpClientHelper(LoginActivity.this);
JSONObject json = httpClientHelper.postJSON(apiURL
, params);
...... rest of the code
}
}
这是HttpClientHelper
public class HttpClientHelper {
private Activity activity;
private static HttpURLConnection urlConnection;
private static String result;
private static JSONObject jsonObject = null;
public HttpClientHelper(){
}
public HttpClientHelper(Activity activity){
this.activity=activity;
}
public JSONObject postJSON(String url, Map<String, String> params) {
Params param = new Params(url, params);
PostAsyncTask myTask = new PostAsyncTask();
try {
jsonObject = myTask.execute(param).get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
return jsonObject;
}
private class PostAsyncTask extends AsyncTask<Params, String, JSONObject> {
JSONObject json = null;
ProgressDialog progressDialog;
public PostAsyncTask(){
}
@Override
protected void onPreExecute(){
super.onPreExecute();
progressDialog = new ProgressDialog(activity);
progressDialog.setTitle("Login");
progressDialog.setMessage("Loading..Please Wait");
progressDialog.setIndeterminate(true);
progressDialog.setCancelable(true);
progressDialog.show();
}
@Override
protected JSONObject doInBackground(Params... args) {
json = HttpClientHelper.getJSONFromURL(args[0].url, args[0].params);
return json;
}
@Override
protected void onPostExecute(JSONObject json) {
super.onPostExecute(json);
if (progressDialog.isShowing()) {
progressDialog.dismiss();
}
}
}
}
答案 0 :(得分:0)
进度对话框与UI相关联,并且不建议将视图中的任何更新放入AsyncTask中。 UI更新或更改应发生在UI线程中。 在您的情况下,可以通过设置AsyncTask的侦听器来实现所需的结果。只需添加一个监听器类并在活动类中实现监听器。
这是一个例子。 HttpResponseListener.java
public interface HttpResponseListener {
public void httpResponseReceiver(String result);
}
现在在您的LoginActivity中实现如下界面:
public class LoginActivity extends AppCompatActivity implements HttpResponseListener {
// rest of your code
// initialize your progress dialogue here and execute the asynctask
progressDialogue.show();
myTask.execute();
myTask.mHttpResponseListener = this;
@Override
public void httpResponseReceiver(String result) {
if(result == null)progressDialogue.dismiss();
else {
// Use result to serve your purpose
progressDialogue.dismiss();
}
}
}
现在在AsyncTask类中,将结果设置为post execute。
private class PostAsyncTask extends AsyncTask<Params, String, JSONObject> {
JSONObject json = null;
ProgressDialog progressDialog;
public HttpResponseListener mHttpResponseListener;
public PostAsyncTask(){
}
@Override
protected void onPreExecute(){
super.onPreExecute();
}
@Override
protected JSONObject doInBackground(Params... args) {
json = HttpClientHelper.getJSONFromURL(args[0].url, args[0].params);
return json;
}
@Override
protected void onPostExecute(JSONObject json) {
super.onPostExecute(json);
mHttpResponseListener.httpResponseReceiver("OK");
}
@Override
protected void onCancelled() {
mHttpResponseListener.httpResponseReceiver(null);
}
}