我从服务中收到了json数据。我使用asynctask来获取数据。当数据为空时,我想取消asynstask并向用户显示一些消息。
public class MainActivity extends ActionBarActivity {
// Progress Dialog
private ProgressDialog pDialog;
private LoadCategories mTask;
.....
/**
* Listening to Load More button click event
* */
btnLoadMore.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
if (URL_CATEGORY == null || URL_CATEGORY == "")
{Toast.makeText(MainActivity.this,"URL est vide", Toast.LENGTH_LONG).show();}
else
{ // Starting a new async task
//new LoadCategories().execute();
mTask = new LoadCategories();
mTask.execute();
}
}
});
....
class LoadCategories extends AsyncTask<String, String, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(MainActivity.this);
pDialog.setMessage("en cours...");
pDialog.setIndeterminate(false);
pDialog.setCancelable(true);
pDialog.show();
}
@Override
protected String doInBackground(String... args) {
// Building Parameters
List<NameValuePair> params = new ArrayList<NameValuePair>();
// getting JSON string from URL
String json = jsonParser.makeHttpRequest(URL_CATEGORY, "GET",
params);
if (json == null || json == "")
{
mTask.cancel(true);
// if(isCancelled())
// {Toast.makeText(MainActivity.this,"Donée sont vide", Toast.LENGTH_LONG).show();}
synchronized(this) {
while (json.length() == 0) {
if(mTask.isCancelled())
{ Toast.makeText(MainActivity.this,"Donée sont vide", Toast.LENGTH_LONG).show();}
}
}
}
// Check your log cat for JSON reponse
Log.d("Categories JSON: ", "> " + json);
return json;
}
@Override
protected void onPostExecute(String json) {
try {
categories = new JSONArray(json);
categoryList.clear();
if (categories != null) {
// looping through All albums
for (int i = 0; i < categories.length(); i++) {
JSONObject c = categories.getJSONObject(i);
.....
我的问题是程序永远不会取消并显示消息。 当我调试它时,它进入我的状态
if (json == null || json == "")
{
mTask.cancel(true);
// if(isCancelled())
// {Toast.makeText(MainActivity.this,"Donée sont vide", Toast.LENGTH_LONG).show();}
synchronized(this) {
while (json.length() == 0) {
if(mTask.isCancelled())
{ Toast.makeText(MainActivity.this,"Donée sont vide", Toast.LENGTH_LONG).show();}
}
}
}
答案 0 :(得分:1)
试试这个......
protected String doInBackground(String... args) {
// code
if (json.equals(null) || json.equals("")){
if(mTask.isCancelled()) break;
return null;
}
return json;
}
onPostExecute
protected void onPostExecute(String json) {
if(json.equals(null) || json.equals("")){
// Make a toast Message
}else{
// your code
}
无需取消您的异步任务....
答案 1 :(得分:0)
只需在异步类后台检查isCancelled()一次:
protected String doInBackground(Object... x) {
while (/* condition */) {
// work...
if (isCancelled()) break;
}
return null;
}
答案 2 :(得分:0)
从Android文档中,您可以覆盖在取消AsyncTask时将调用的onCancelled()
方法
取消任务
可以通过调用随时取消任务 取消(布尔值)。调用此方法将导致后续调用 isCancelled()返回true。调用此方法后, onCancelled(Object),而不是onPostExecute(Object)将被调用 在doInBackground(Object [])返回之后。确保完成任务 尽快取消,你应该经常检查退货 ifCancelled()的值定期来自doInBackground(Object []),if 可能的(例如在循环内)。
或者您也可以在循环中检查isCancelled,例如:
if (isCancelled()) {
Toast.makeText(getContext(), "AsyncTask is Cancelled", Toast.LENGTH_SHORT).show();
break;
}
else
{
// some process
}
答案 3 :(得分:0)
如果您要处理取消活动,请覆盖onCancelled()
课程中AsyncTask
的{{1}}方法。将用于显示toast消息的代码移动到您自己的LoadCategories
方法中。
但是,我认为onCancelled()
没有必要。我建议检查mTask.cancel()
值并决定在json
中显示Toast消息。