在 android asynctask 中加载有时会花费很多时间
loading takes so much time sometimes in android asynctask
我正在使用 AsyncTask 调用网络服务并呈现我从网络服务获得的数据。
这工作正常,但有时进度对话框不会被关闭,也无法在日志中看到此问题的原因。
示例::
我有一个 Web 服务,它被调用以获取带有索引的列表视图数据(对于 1,它将 return 前 5 个数据,对于 2,它将 return 第二个 5 数据,依此类推)
单击第 1 页按钮后,它 return 的数据并呈现相同的内容,当我单击第 2 页按钮时,它开始加载并且不会关闭。既不呈现数据也不关闭进度对话框。
现在我关闭了应用程序并再次重新启动,这一次情况都很好。
如有任何帮助,我们将不胜感激
提前致谢
异步任务代码:
public class getList extends AsyncTask<Void, String, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(getActivity());
pDialog.setCancelable(false);
pDialog.setMessage("Please wait...");
pDialog.setCanceledOnTouchOutside(false);
pDialog.show();
}
@Override
protected String doInBackground(Void... params) {
String text = null;
JSONObject json;
HttpClient httpclient = new DefaultHttpClient();
//Configuration.empcode.trim()
HttpGet httppost = new HttpGet(ListURL+UserCode+"/"+indexNo);
try {
HttpResponse response = httpclient.execute(httppost);
// for JSON:
if (response != null) {
InputStream is = response.getEntity().getContent();
BufferedReader reader = new BufferedReader(
new InputStreamReader(is));
// String result = EntityUtils.toString((HttpEntity)
// response);
StringBuilder sb = new StringBuilder();
String line = null;
try {
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
text = sb.toString();
}
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
} catch (IOException e) {
// TODO Auto-generated catch block
}
return text;
}
@Override
protected void onPostExecute(String result)
{
pDialog.dismiss();
if(result!=null)
{
try
{
JSONObject resultObject = new JSONObject(result);
JSONArray resultArray = resultObject.getJSONArray("Table");
for(int i =0;i<resultArray.length();i++)
{
JSONObject resultObjects = resultArray.getJSONObject(i);
Code = resultObjects.getString("Code");
Title = resultObjects.getString("Title");
status= resultObjects.getString("status");
date= resultObjects.getString("date");
TitleList.add(Title);
CodeList.add(Code);
statusList.add(status);
dateList.add(date);
int count = db.getInProgressCount(CourseCode);
if(count==0)
{
db.addInProgress(new InProgressTable(Code,Title,status,date));
}
else
{
db.updateInProgress(new InProgressTable(Code,Title,status,date));
}
}
adapter = new CustomInProgressList(getActivity(),TitleList,CodeList,statusList,dateList);
//adapter.setCustomButtonListner(Catalog_Activity.this);
list.setAdapter(adapter);
scrollMyListViewToBottom(resultArray.length());
int count = db.getAllInProgressCount();
if (adapter.getCount()<1 && count<1){
list.setVisibility(View.GONE);
noRes.setVisibility(View.VISIBLE);
}else {
list.setVisibility(View.VISIBLE);
noRes.setVisibility(View.GONE);
}
if (resultArray.length()<5);
loadMore.setVisibility(View.GONE);
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
else
{
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle("Alert");
builder.setMessage("Data is not available, Please try again later");
builder.setPositiveButton("OK", new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialog, int which)
{
dialog.cancel();
}
});
AlertDialog dialog = builder.create();
dialog.show();
}
}
}
我在我的应用程序中使用了多个 Asynctask。
有问题吗??
好的,这是你的问题 -
pDialog
据我了解是在 activity 中声明的。让我们看看有 2 个请求的情况。
当您启动第一个并立即启动另一个时 - 您的 pDialog
现在是新对话框(它指向另一个对话框)并且第一个存在但没有指向它,并且它没有关闭!这就是您没有关闭对话框的原因。
这将在以下情况下引起:
1) 第一个请求开始;
2) 在第一个请求结束之前开始第二个请求;
您必须在所有请求中处理一个对话框,或者在重新初始化之前关闭对话框。
我正在使用 AsyncTask 调用网络服务并呈现我从网络服务获得的数据。
这工作正常,但有时进度对话框不会被关闭,也无法在日志中看到此问题的原因。
示例:: 我有一个 Web 服务,它被调用以获取带有索引的列表视图数据(对于 1,它将 return 前 5 个数据,对于 2,它将 return 第二个 5 数据,依此类推)
单击第 1 页按钮后,它 return 的数据并呈现相同的内容,当我单击第 2 页按钮时,它开始加载并且不会关闭。既不呈现数据也不关闭进度对话框。 现在我关闭了应用程序并再次重新启动,这一次情况都很好。
如有任何帮助,我们将不胜感激 提前致谢
异步任务代码:
public class getList extends AsyncTask<Void, String, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(getActivity());
pDialog.setCancelable(false);
pDialog.setMessage("Please wait...");
pDialog.setCanceledOnTouchOutside(false);
pDialog.show();
}
@Override
protected String doInBackground(Void... params) {
String text = null;
JSONObject json;
HttpClient httpclient = new DefaultHttpClient();
//Configuration.empcode.trim()
HttpGet httppost = new HttpGet(ListURL+UserCode+"/"+indexNo);
try {
HttpResponse response = httpclient.execute(httppost);
// for JSON:
if (response != null) {
InputStream is = response.getEntity().getContent();
BufferedReader reader = new BufferedReader(
new InputStreamReader(is));
// String result = EntityUtils.toString((HttpEntity)
// response);
StringBuilder sb = new StringBuilder();
String line = null;
try {
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
text = sb.toString();
}
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
} catch (IOException e) {
// TODO Auto-generated catch block
}
return text;
}
@Override
protected void onPostExecute(String result)
{
pDialog.dismiss();
if(result!=null)
{
try
{
JSONObject resultObject = new JSONObject(result);
JSONArray resultArray = resultObject.getJSONArray("Table");
for(int i =0;i<resultArray.length();i++)
{
JSONObject resultObjects = resultArray.getJSONObject(i);
Code = resultObjects.getString("Code");
Title = resultObjects.getString("Title");
status= resultObjects.getString("status");
date= resultObjects.getString("date");
TitleList.add(Title);
CodeList.add(Code);
statusList.add(status);
dateList.add(date);
int count = db.getInProgressCount(CourseCode);
if(count==0)
{
db.addInProgress(new InProgressTable(Code,Title,status,date));
}
else
{
db.updateInProgress(new InProgressTable(Code,Title,status,date));
}
}
adapter = new CustomInProgressList(getActivity(),TitleList,CodeList,statusList,dateList);
//adapter.setCustomButtonListner(Catalog_Activity.this);
list.setAdapter(adapter);
scrollMyListViewToBottom(resultArray.length());
int count = db.getAllInProgressCount();
if (adapter.getCount()<1 && count<1){
list.setVisibility(View.GONE);
noRes.setVisibility(View.VISIBLE);
}else {
list.setVisibility(View.VISIBLE);
noRes.setVisibility(View.GONE);
}
if (resultArray.length()<5);
loadMore.setVisibility(View.GONE);
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
else
{
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle("Alert");
builder.setMessage("Data is not available, Please try again later");
builder.setPositiveButton("OK", new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialog, int which)
{
dialog.cancel();
}
});
AlertDialog dialog = builder.create();
dialog.show();
}
}
}
我在我的应用程序中使用了多个 Asynctask。 有问题吗??
好的,这是你的问题 -
pDialog
据我了解是在 activity 中声明的。让我们看看有 2 个请求的情况。
当您启动第一个并立即启动另一个时 - 您的 pDialog
现在是新对话框(它指向另一个对话框)并且第一个存在但没有指向它,并且它没有关闭!这就是您没有关闭对话框的原因。
这将在以下情况下引起:
1) 第一个请求开始;
2) 在第一个请求结束之前开始第二个请求;
您必须在所有请求中处理一个对话框,或者在重新初始化之前关闭对话框。