如何在 AsyncTask 中创建进度对话框?
How to create a progress dialog inside of AsyncTask?
我有一个 FullRest API 其中 returns 一个 StatusCode,我成功了,问题是,无法从 AsyncTask 调用进度对话框,我只想 "show"用户发生了什么,if(statusCode == 201)
.. 成功 POST,到目前为止:
PostBaseClass..
public class PostBase {
private static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
private String Url="http://192.168.0.101:3000/";
OkHttpClient client = new OkHttpClient();
int POST(final PostModel model) throws IOException{
Gson gson = new Gson();
String modelJson = gson.toJson(model);
RequestBody body = RequestBody.create(JSON,modelJson);
Request request = new Request.Builder()
.url(Url + "api/gone/POST")
.post(body)
.build();
Response response = client.newCall(request).execute();
return response.code();
}
主要活动..
public void MakePost(final PostModel postModel){
new AsyncTask<Void,Void,Void>(){
@Override
protected Void doInBackground(Void... params) {
try {
PostBase postBase = new PostBase();
statusCode = postBase.POST(postModel);
if(statusCode == 201){
//TODO
}else {
//TODO
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}.execute();
}
https://developer.android.com/reference/android/os/AsyncTask.html
onPreExecute
和 onPostExecute
运行 在 ui 线程上,而您无法从 doInBackground
更新 ui,因为它 运行s 在后台线程上
因此在 onPreExecute
中显示对话框并在 onPostExecute
中关闭对话框
Return doInBackground
中的一些值,并根据返回的值在 onPostExecute
中执行必要的操作。
如果您想显示上传进度,您可以使用 onProgressUpdate
new AsyncTask<Void,Void,String>(){
@Override
protected void onPreExecute()
{
super.onPreExecute()
// runs on the ui thread
// show dialog
}
@Override
protected String doInBackground(Void... params) {
try {
PostBase postBase = new PostBase();
statusCode = postBase.POST(postModel);
if(statusCode == 201){
return "successful";
}else {
return "notsuccessful"
}
} catch (IOException e) {
e.printStackTrace();
}
return "something";
}
@Override
protected void onPostExecute(String result)
{
super.onPostExecute();
// dismiss dialog
if(result.equals("successful")
{
// do something on successful
// runs on the ui thread so do update ui
}
}
}.execute();
除了异步任务代码,您似乎正在使用 Retrofit
。您也可以使用相同的方式进行异步调用。
将 ProgressDialog 放在 onPreExecute 中,示例代码如下:
private ProgressDialog pd;
@Override
protected void onPreExecute(){
super.onPreExecute();
pd = new ProgressDialog(yourContext);
pd.setMessage("Loading...");
pd.show();
}
@Override
protected void onPostExecute(String result){
super.onPostExecute(result);
pd.dismiss();
}
谢谢
我有一个 FullRest API 其中 returns 一个 StatusCode,我成功了,问题是,无法从 AsyncTask 调用进度对话框,我只想 "show"用户发生了什么,if(statusCode == 201)
.. 成功 POST,到目前为止:
PostBaseClass..
public class PostBase {
private static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
private String Url="http://192.168.0.101:3000/";
OkHttpClient client = new OkHttpClient();
int POST(final PostModel model) throws IOException{
Gson gson = new Gson();
String modelJson = gson.toJson(model);
RequestBody body = RequestBody.create(JSON,modelJson);
Request request = new Request.Builder()
.url(Url + "api/gone/POST")
.post(body)
.build();
Response response = client.newCall(request).execute();
return response.code();
}
主要活动..
public void MakePost(final PostModel postModel){
new AsyncTask<Void,Void,Void>(){
@Override
protected Void doInBackground(Void... params) {
try {
PostBase postBase = new PostBase();
statusCode = postBase.POST(postModel);
if(statusCode == 201){
//TODO
}else {
//TODO
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}.execute();
}
https://developer.android.com/reference/android/os/AsyncTask.html
onPreExecute
和 onPostExecute
运行 在 ui 线程上,而您无法从 doInBackground
更新 ui,因为它 运行s 在后台线程上
因此在 onPreExecute
中显示对话框并在 onPostExecute
Return doInBackground
中的一些值,并根据返回的值在 onPostExecute
中执行必要的操作。
如果您想显示上传进度,您可以使用 onProgressUpdate
new AsyncTask<Void,Void,String>(){
@Override
protected void onPreExecute()
{
super.onPreExecute()
// runs on the ui thread
// show dialog
}
@Override
protected String doInBackground(Void... params) {
try {
PostBase postBase = new PostBase();
statusCode = postBase.POST(postModel);
if(statusCode == 201){
return "successful";
}else {
return "notsuccessful"
}
} catch (IOException e) {
e.printStackTrace();
}
return "something";
}
@Override
protected void onPostExecute(String result)
{
super.onPostExecute();
// dismiss dialog
if(result.equals("successful")
{
// do something on successful
// runs on the ui thread so do update ui
}
}
}.execute();
除了异步任务代码,您似乎正在使用 Retrofit
。您也可以使用相同的方式进行异步调用。
将 ProgressDialog 放在 onPreExecute 中,示例代码如下:
private ProgressDialog pd;
@Override
protected void onPreExecute(){
super.onPreExecute();
pd = new ProgressDialog(yourContext);
pd.setMessage("Loading...");
pd.show();
}
@Override
protected void onPostExecute(String result){
super.onPostExecute(result);
pd.dismiss();
}
谢谢