Lis*_*nne 6 concurrency multithreading android asynchronous
请不要关闭这个,恕我直言这是体面的,可能有用的编程问题.
请我阅读很多东西,因为我读了不同的意见和不同的方法,我感到很困惑.
问题如下:
在getView()一个Adapter我需要执行一些异步操作,如检查在网络上的形成和更新基于该视图.
我使用了以下方法:
每次getView()都叫我开始了Thread
但我的做法为我赢得了很多批评:
public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder holder;            
    if (convertView == null) {                
        //...         
    } 
    else {                
        //...
    }     
    Thread th= new Thread(new Runnable() {
           @Override
           public void run() {
                mActivity.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        CheckSomeInfoOverTheInternet(url, new myCallback {
                            @Override
                            public void onSuccess() {
                            holder.textview.setText("OK");
                            }
                            @Override
                            public void onFailre() {
                            holder.textview.setText("NOT OK!!!!");
                            }    
                        });
                    }
                });
           }
       });
    th.start();
    return convertView;
}  
请问做这样事情的最佳做法是什么?
请注意,我不是在寻找执行网络请求的解决方案getView(),而是根据异步调用的结果更新视图.
这绝对不是一个更新信息的好方法ListView.该getView方法应该只根据您已有的数据创建视图.当然不应该运行任何东西来获取更多信息.
我能给你的最好建议是事先获取数据.拉取数据,更新ArrayList您Adapter所连接的数据,然后调用adapter.notifyDataSetChanged().这将重绘您的所有信息.
一次性拉动数据 - 不是小部件.这是执行此操作的最佳和最合理的方法.
为此有几种方法。虽然你现在做的事情确实不合适。
处理程序和线程
总之,当前方法的主要缺点: - 需要进行更改时会丢失上下文。- 显式创建多个线程
虽然后者是一个主要问题,但更“用户引人注目”的问题将是第一个。
根据您需要的控制以及您在 android 回调和线程管理方面的专业知识,还有并且可能有几种其他方法。但这三种(根据我的说法)是最合适的。
PS:所有这些方法的共同点是,
public View getView(int position, View convertView, ViewGroup     parent) { 
    ViewHolder holder;            
    if (convertView == null) {                
        //...         
    } 
    else {                
        //...
    }     
    //execute a task for your given id where task could be:
    //1. AsyncTask
    //2. AsyncTaskLoader
    //3. Handlers and thread
    //call notifyDataSetChanged() in all the cases,
    return convertView;
}
 @Override
 public void notifyDataSetChanged() {
        super.notifyDataSetChanged();
        //do any tasks which you feel are required
 } 
PPS:您还可以查看DataSetObserver来再次自动化您的需求。