Android从listview行单击多个异步任务

Android从listview行单击多个异步任务,android,android-asynctask,Android,Android Asynctask,我在使用自定义适配器多次单击ListView时遇到问题 我很好地捕捉到了onClick事件,问题是我需要在调用webservice的每一行单击上启动一个异步任务。 这是相同的异步任务,只是参数不同 如果用户快速单击多行,则仅激发最后一个异步任务,并且仅更新该行 处理onClick()的代码 myListView.setOnItemClickListener(新的OnItemClickListener() { public void onItemClick(AdapterView父对象、视图、整型

我在使用自定义适配器多次单击ListView时遇到问题

我很好地捕捉到了onClick事件,问题是我需要在调用webservice的每一行单击上启动一个异步任务。 这是相同的异步任务,只是参数不同

如果用户快速单击多行,则仅激发最后一个异步任务,并且仅更新该行

处理onClick()的代码

myListView.setOnItemClickListener(新的OnItemClickListener()
{
public void onItemClick(AdapterView父对象、视图、整型位置、长id)
{
Item Item=(Item)MyllsView.getAdapter().getItem(位置);
//执行异步任务
}
});
我的异步任务

private class CheckItemInOrOutTask extends AsyncTask<Context, Void, Boolean>
{
    private int position;
    Item singleItem;

    public CheckItemInOrOutTask(int position, Item singleItem)
    {
        this.position = position;
        this.singleItem = singleItem;
    }

    @Override
    protected void onPreExecute() 
    {
        super.onPreExecute();           
    }

    @Override
    protected Boolean doInBackground(Context... params) 
    {
        try 
        {
            HttpClient client = HttpUtil.getHttpClient();
            String reqString = "Items?action=checkin";

            HttpPost post = HttpUtil.makePost(reqString);       

            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
            nameValuePairs.add(new BasicNameValuePair("item_id", singleItem.getId()));

            nameValuePairs.add(new BasicNameValuePair("type_id", singleItem.getTypeId()));              

            post.setEntity(new UrlEncodedFormEntity(nameValuePairs));               

            HttpResponse response = client.execute(post);
            int statusCode = response.getStatusLine().getStatusCode();

            if (statusCode == 200) 
            {           
                String result = HttpUtil.responseToString(response);    
                JSONObject jsonItem = new JSONObject(result);
                Item item = new Item(); 

                // parse json
                // set item properties          

                itemList.set(position,item);                    
            }               
        }
        catch (Exception e)
        {
            return false;
        }   

        return true;
    }

    @Override
    protected void onPostExecute(Boolean result) 
    {
        super.onPostExecute(result);    

        //if (result) 
        {
            updateAdapter();                            
        }       
    }       
}
私有类checkItemInRoutTask扩展了AsyncTask
{
私人职位;
项目单一项目;
public CheckItemInRoutTask(整型位置,Item singleItem)
{
这个位置=位置;
this.singleItem=singleItem;
}
@凌驾
受保护的void onPreExecute()
{
super.onPreExecute();
}
@凌驾
受保护的布尔doInBackground(上下文…参数)
{
尝试
{
HttpClient=HttpUtil.getHttpClient();
String reqString=“项目?操作=签入”;
HttpPost=HttpUtil.makePost(reqString);
List nameValuePairs=新的ArrayList();
添加(新的BasicNameValuePair(“item_id”,singleItem.getId());
添加(新的BasicNameValuePair(“type_id”,singleItem.getTypeId());
setEntity(新的UrlEncodedFormEntity(nameValuePairs));
HttpResponse response=client.execute(post);
int statusCode=response.getStatusLine().getStatusCode();
如果(状态代码==200)
{           
字符串结果=HttpUtil.responseToString(响应);
JSONObject jsonItem=新的JSONObject(结果);
项目=新项目();
//解析json
//设置项目属性
itemList.set(位置、项目);
}               
}
捕获(例外e)
{
返回false;
}   
返回true;
}
@凌驾
受保护的void onPostExecute(布尔结果)
{
super.onPostExecute(结果);
//如果(结果)
{
updateAdapter();
}       
}       
}
有人能解释一下吗


非常感谢。

发现罪魁祸首不是AsyncTask。
这是因为我在重用我的HttpClient。

您是否使用ProgressDialog进行此更新??您想更新用户单击的所有行吗?我没有使用ProgressDialog。该应用预计将以这种方式使用,用户可以快速地一行一行地点击。然后更新所有行。
updateAdapter()
中有什么?此
itemList.set(位置,项)也看起来可疑。您的AsyncTask应该返回一个项而不是布尔值,任何更新适配器的内容都应该放在onPostExecute中,但这只是为了正确性,它可能不会影响实际结果。为此,您可以使用可选择的选项,对吗???意思是勾选类似的东西。。所以首先需要得到用户想要更新的位置。。然后更新这些行。。
private class CheckItemInOrOutTask extends AsyncTask<Context, Void, Boolean>
{
    private int position;
    Item singleItem;

    public CheckItemInOrOutTask(int position, Item singleItem)
    {
        this.position = position;
        this.singleItem = singleItem;
    }

    @Override
    protected void onPreExecute() 
    {
        super.onPreExecute();           
    }

    @Override
    protected Boolean doInBackground(Context... params) 
    {
        try 
        {
            HttpClient client = HttpUtil.getHttpClient();
            String reqString = "Items?action=checkin";

            HttpPost post = HttpUtil.makePost(reqString);       

            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
            nameValuePairs.add(new BasicNameValuePair("item_id", singleItem.getId()));

            nameValuePairs.add(new BasicNameValuePair("type_id", singleItem.getTypeId()));              

            post.setEntity(new UrlEncodedFormEntity(nameValuePairs));               

            HttpResponse response = client.execute(post);
            int statusCode = response.getStatusLine().getStatusCode();

            if (statusCode == 200) 
            {           
                String result = HttpUtil.responseToString(response);    
                JSONObject jsonItem = new JSONObject(result);
                Item item = new Item(); 

                // parse json
                // set item properties          

                itemList.set(position,item);                    
            }               
        }
        catch (Exception e)
        {
            return false;
        }   

        return true;
    }

    @Override
    protected void onPostExecute(Boolean result) 
    {
        super.onPostExecute(result);    

        //if (result) 
        {
            updateAdapter();                            
        }       
    }       
}