异步任务的 ProgressBar Spinner 不起作用
ProgressBar Spinner for Async Task doesn't work
我的问题是,当我单击按钮 "Click" 调用我的 API 时,它应该在我调用 API 时显示我的进度条(微调器)。相反,我的应用程序冻结不到一秒钟,然后当它完成调用时,它会短暂显示我的加载微调器(它只是闪烁)
这是我的代码
private ProgressBar spinner;
public View onCreateView(...)
{
spinner = (ProgressBar) view.findViewById(R.id.progressBar1);
spinner.setVisibility(View.GONE);
...
}
private class MyTask extends AsyncTask<String, Void, Void> {
String pageContent = "";
DataOutputStream wr;
@Override
protected void onPreExecute() {
spinner.setVisibility(View.VISIBLE);
}
@Override
public Void doInBackground(String... params) {
requestResult.setSuccess(false);
HttpURLConnection connection;
try {
String url = "myURL";
//I only call my Api here. I delete rest so this won't bother you
requestResult.setSuccess(true);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void result) {
JsonParser parser = new JsonParser();
//Same here i delete nonimportant
MyResponse = new Gson().fromJson(jsonContent, MyResponse.class);
done();
spinner.setVisibility(View.GONE);
}
}
我试过不同的东西,它总是冻结一秒钟,然后我的加载微调器闪烁,我的内容来自 API。
你能帮我做那个吗?
我的xml文件
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/scroll_view_send"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<RelativeLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:minWidth="25px"
android:minHeight="25px">
<ProgressBar
android:id="@+id/progressBar1"
style="?android:attr/progressBarStyleLarge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_below="@id/buttonSend"
android:visibility="gone"/>
</RelativeLayout>
</ScrollView>
请试试这个工作示例,像这样将 spinner
传递给您的 MyTask
:
private class MyTask extends AsyncTask<String, Void, Void> {
String pageContent = "";
DataOutputStream wr;
private final ProgressBar progress;
public MyTask(final ProgressBar progress) {
this.progress = progress;
}
@Override
protected void onPreExecute() {
progress.setVisibility(View.VISIBLE);
}
...
@Override
protected void onPostExecute(Void result) {
JsonParser parser = new JsonParser();
//Same here i delete nonimportant
MyResponse = new Gson().fromJson(jsonContent, MyResponse.class);
done();
progress.setVisibility(View.GONE);
}
}
然后调用new MyTask(progress).execute();
编辑: 在您的问题中,您提到您的 phone 在调用 MyTask 时冻结...
请检查此步骤以避免在 AsyncTask:
中冻结您的 UI
- 不要调用
MyTask
使用新的 MyTask().get()
- 尝试转到
doInBackground
这部分 MyResponse = new Gson().fromJson(jsonContent, MyResponse.class); done();
这可能会很昂贵。
希望对您有所帮助!!
试试下面的代码片段。它不需要在布局文件中声明微调器。
AsyncTask<String, String, String> asyncObject =
new AsyncTask<String, String, String>() {
ProgressDialog progDailog;
@Override
protected void onPreExecute() {
super.onPreExecute();
progDailog =
new ProgressDialog(Activity.this);
progDailog.setMessage("Loading");
progDailog.setCancelable(false);
progDailog.show();
}
@Override
protected String doInBackground(String... urls) {
//Do background stuff here
return null;
}
@Override
protected void onPostExecute(String result) {
progDailog.cancel();
//Do post background stuff here.
}
};
asyncObject.execute(null, null, null);
我的问题是,当我单击按钮 "Click" 调用我的 API 时,它应该在我调用 API 时显示我的进度条(微调器)。相反,我的应用程序冻结不到一秒钟,然后当它完成调用时,它会短暂显示我的加载微调器(它只是闪烁)
这是我的代码
private ProgressBar spinner;
public View onCreateView(...)
{
spinner = (ProgressBar) view.findViewById(R.id.progressBar1);
spinner.setVisibility(View.GONE);
...
}
private class MyTask extends AsyncTask<String, Void, Void> {
String pageContent = "";
DataOutputStream wr;
@Override
protected void onPreExecute() {
spinner.setVisibility(View.VISIBLE);
}
@Override
public Void doInBackground(String... params) {
requestResult.setSuccess(false);
HttpURLConnection connection;
try {
String url = "myURL";
//I only call my Api here. I delete rest so this won't bother you
requestResult.setSuccess(true);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void result) {
JsonParser parser = new JsonParser();
//Same here i delete nonimportant
MyResponse = new Gson().fromJson(jsonContent, MyResponse.class);
done();
spinner.setVisibility(View.GONE);
}
}
我试过不同的东西,它总是冻结一秒钟,然后我的加载微调器闪烁,我的内容来自 API。
你能帮我做那个吗?
我的xml文件
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/scroll_view_send"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<RelativeLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:minWidth="25px"
android:minHeight="25px">
<ProgressBar
android:id="@+id/progressBar1"
style="?android:attr/progressBarStyleLarge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_below="@id/buttonSend"
android:visibility="gone"/>
</RelativeLayout>
</ScrollView>
请试试这个工作示例,像这样将 spinner
传递给您的 MyTask
:
private class MyTask extends AsyncTask<String, Void, Void> {
String pageContent = "";
DataOutputStream wr;
private final ProgressBar progress;
public MyTask(final ProgressBar progress) {
this.progress = progress;
}
@Override
protected void onPreExecute() {
progress.setVisibility(View.VISIBLE);
}
...
@Override
protected void onPostExecute(Void result) {
JsonParser parser = new JsonParser();
//Same here i delete nonimportant
MyResponse = new Gson().fromJson(jsonContent, MyResponse.class);
done();
progress.setVisibility(View.GONE);
}
}
然后调用new MyTask(progress).execute();
编辑: 在您的问题中,您提到您的 phone 在调用 MyTask 时冻结... 请检查此步骤以避免在 AsyncTask:
中冻结您的 UI- 不要调用
MyTask
使用新的MyTask().get()
- 尝试转到
doInBackground
这部分MyResponse = new Gson().fromJson(jsonContent, MyResponse.class); done();
这可能会很昂贵。
希望对您有所帮助!!
试试下面的代码片段。它不需要在布局文件中声明微调器。
AsyncTask<String, String, String> asyncObject =
new AsyncTask<String, String, String>() {
ProgressDialog progDailog;
@Override
protected void onPreExecute() {
super.onPreExecute();
progDailog =
new ProgressDialog(Activity.this);
progDailog.setMessage("Loading");
progDailog.setCancelable(false);
progDailog.show();
}
@Override
protected String doInBackground(String... urls) {
//Do background stuff here
return null;
}
@Override
protected void onPostExecute(String result) {
progDailog.cancel();
//Do post background stuff here.
}
};
asyncObject.execute(null, null, null);