Как я загружаю данные из сети через api, когда пользователь прокручивает в нижней части списка ListView, но когда я просматриваю список в виде списка, он вызывает многократную вызов asynctask в моей деятельности, которая вызывает дубликаты данных в listview, а в случае исключения много диалогов и тостов по активности, а когда я прокручиваю вниз и просто просто касаюсь моего списка в режиме прокрутки, возникает пожар, который вызывает многократную асинтезу, поэтому, пожалуйста, напишите мне, как чтобы предотвратить это.На прослушивании прокрутки, вызывающего asynctask дважды трижды или несколько раз больше на прокрутку один раз на listview
вот мой код метода onscroll.
listView.setOnScrollListener(new OnScrollListener() {
// boolean mIsScrollingUp;
// int mLastFirstVisibleItem;
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
// TODO Auto-generated method stub
if(scrollState == OnScrollListener.SCROLL_STATE_TOUCH_SCROLL)
userscrolled=true;
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
// TODO Auto-generated method stub
int lasinscren = firstVisibleItem + visibleItemCount;
if(userscrolled&&(lasinscren==totalItemCount)&&!lodinmore&&(visibleItemCount<totalItemCount)&&havedata)
{
progress = true;
if(Search_API==false){
if(connectionDetector.isConnectintoInternet()){
System.out.println("inside listview on scroll function");
darList_task = new DAR_list_task(DAR_Activity.this).execute();
lodinmore = true;
}else
{
Toast.makeText(getApplicationContext(), "No internet connection", Toast.LENGTH_SHORT).show();
}
}else
{
new search_task(DAR_Activity.this).execute();
}
}
}
});
вот мой AsyncTask
public class DAR_list_task extends AsyncTask<Void, Void, Void>
{
Context activity;
public DAR_list_task(Context activity) {
// TODO Auto-generated constructor stub
this.activity = activity;
}
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
if(progress==true){
if(limit==0)
{
dialog = new Dialog(DAR_Activity.this);
dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
LinearLayout linearLayout = (LinearLayout)getLayoutInflater().inflate(R.layout.dialog_progress, null);
dialog.setContentView(linearLayout);
ProgressBar progressBar1 = (ProgressBar)findViewById(R.id.progress_dialog);
dialog.setCancelable(false);
dialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
dialog.setCanceledOnTouchOutside(false);
dialog.show();
dialog.getWindow().setGravity(Gravity.CENTER);
}else
{
progressBar.setVisibility(View.VISIBLE);
}
}
}
@Override
protected Void doInBackground(Void... params) {
// TODO Auto-generated method stub
response=null;
lodinmore = true;
URL Url;
try {
byte[] data;
data = login_id.getBytes("UTF-8");
String login_base_64 = Base64.encode(data);
data = gcm_id.getBytes("UTF-8");
String gcm_base64= Base64.encode(data);
if(url.contentEquals(""))
{
Url = new URL(getResources().getString(R.string.dar_list_view));
}else
{
Url = new URL("http://"+url+"/smart_oms/dar_app/view_dar.php");
}
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair("login_id", login_base_64));
nameValuePairs.add(new BasicNameValuePair("gcm_id", gcm_base64));
nameValuePairs.add(new BasicNameValuePair("limit", String.valueOf(limit)));
HttpURLConnection httpURLConnection = (HttpURLConnection)Url.openConnection();
httpURLConnection.setRequestMethod("POST");
httpURLConnection.setUseCaches(false);
httpURLConnection.setDoOutput(true);
OutputStream os = httpURLConnection.getOutputStream();
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(os, "UTF-8"));
bufferedWriter.write(getQueryString(nameValuePairs));
bufferedWriter.flush();
bufferedWriter.close();
os.close();
httpURLConnection.connect();
InputStream inputStream = httpURLConnection.getInputStream();
response = BufferReaderMaker.readContentFromIS(inputStream);
}catch(final UnknownHostException ex)
{
runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(getApplicationContext(), ex.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}catch (final ConnectTimeoutException e) {
// TODO: handle exception
runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
catch (Exception e) {
// TODO: handle exception
}
return null;
}
@Override
protected void onPostExecute(Void result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
Object json = null;
try {
if(response!=null)
{
if(progress==false)
{
dar_List_Items.clear();
dar_Aadapter = new DAR_Aadapter(DAR_Activity.this, dar_List_Items);
listView.setAdapter(dar_Aadapter);
dar_Aadapter.notifyDataSetChanged();
}
try {
json = new JSONTokener(response).nextValue();
} catch (JSONException e1) {
// TODO Auto-generated catch block
ErrorDialog errorDialog = new ErrorDialog();
errorDialog.Dialog(activity, statusCode, response, login_id, "", new DAR_list_task(activity));
}
if(json instanceof JSONArray)
{
havedata=false;
Toast.makeText(getApplicationContext(), "No More DAR", 0).show();
}else if(json instanceof JSONObject)
{
JSONObject jsonObject = new JSONObject(response);
JSONArray jsonArray = jsonObject.getJSONArray("view_dar_detail");
for(int i =0 ;i<jsonArray.length();)
{
JSONObject json_data = jsonArray.getJSONObject(i);
String dar_id = json_data.optString("customer_id");
String Customer_name = json_data.optString("customer_name");
String Contacted= json_data.optString("contact_person_name");
String product = json_data.optString("product");
String status = json_data.optString("dar_status");
String Contact_type = json_data.optString("contact_type");
String created_date = json_data.optString("dar_created_date");
String request_date = json_data.optString("requeste_date");
DAR_List_Item dar_List_Item = new DAR_List_Item(dar_id,Customer_name, Contacted, Contact_type, product, status, created_date, request_date,"abcd");
dar_List_Items.add(dar_List_Item);
i++;
}
int index = listView.getFirstVisiblePosition();
View v= listView.getChildAt(0);
int top = (v == null) ? 0 : v.getTop();
listView.setAdapter(null);
DAR_Aadapter aadapter = new DAR_Aadapter(DAR_Activity.this, dar_List_Items);
listView.setAdapter(aadapter);
aadapter.notifyDataSetChanged();
listView.setSelectionFromTop(index, top);
}else
{
ErrorDialog errorDialog = new ErrorDialog();
errorDialog.Dialog(activity, statusCode, response, login_id, "", new DAR_list_task(activity));
}
lodinmore = false;
}
lodinmore = false;
} catch (JSONException e) {
// TODO Auto-generated catch block
ErrorDialog errorDialog = new ErrorDialog();
errorDialog.Dialog(activity, statusCode, response, login_id, "", new DAR_list_task(activity));
}
if(progress==true){
if(limit==0)
{
dialog.dismiss();
}else{
progressBar.setVisibility(View.GONE);
}
}
if(json instanceof JSONObject)
limit = limit +10;
}
}
Пожалуйста, помогите мне в этом я попробовал много вещей, как с помощью значения флага и многое другое, но не из них работает для меня.
Как предотвратить вызов вызова асинтетики много раз? Как предотвратить использование asynctask, когда я прокручиваю нижнюю часть и просто касаюсь списка?
http://stackoverflow.com/a/24713773/975292 –
@SeshuVinay Как мне реализовать, почему существует метод в android, чем если он не работает правильно? – Edward