解决方案 »

  1.   

    你可以看看我在这个帖子里的回答,我在那里举例说明了怎么样用AsyncTask来把结果返回给UI线程。
      

  2.   


    谢谢你的回答。不过我还是不太懂,能否请你就着我的代码给修改一下?
    因为我的代码是下面这样的架构,在mainAdapter.java里面调用的data.getData(),不是太清楚AsyncTask该怎么用。
    mainActivty.java ⇒ mainAdapter.java ⇒ data.java
      

  3.   


    代码有些乱,重新贴一下。
    class data
    {
        ...
        
        public Data getData() {
            this.Data = new Data();
            Data Data = new Data();
            params.put("word", this.key);        // 调用API取得数据
            new DataLoader(){
                @Override
                public void resultSFSearchDataJSONParser(
                        SFSearchCountJSONParser sfSearchCountJSONParser, boolean isSuccess) {
                    // TODO Auto-generated method stub
                    super.resultSFSearchDataJSONParser(sfSearchCountJSONParser,isSuccess);
                    Data = (Data)sfSearchCountJSONParser.result.get(0);
                }   
            }.getData(this.key);
            
            return data;
        }
    }   // API取得数据
    class DataLoader implements SFSearchJSONParserDelegate {
        Data Data = new Data();
        private SFSearchCountJSONParser searchJSONParser = null;
        private HashMap<String, String> params = new HashMap<String, String>();
        
        public void getData(String key) {
            params.put("word", key);
            searchJSONParser = new SFSearchCountJSONParser();
            searchJSONParser.parserDelegate = this;
            searchJSONParser.executeStockSearchCountByParams(params); 
        
        }     // 结果返回函数
        @Override
        public void resultSFSearchDataJSONParser(
                SFSearchCountJSONParser sfSearchCountJSONParser, boolean isSuccess) {
            // TODO Auto-generated method stub
            Data = (Data)sfSearchCountJSONParser.result.get(0);
        }
        
    }
      

  4.   

    关键是SFSearchCountJSONParser这个类,我不了解它的工作机制,但看上去是个异步加载类。如果是异步加载类的话,它就已经实现了自己的线程操作和回调,你就不需要自己去创建线程。你要求“让getData()等待resultSFSearchDataJSONParser返回值以后自己才返回给主进程”,这个需求是错误的,因为这会让UI长时间没有响应而卡死。
    你需要做的,其实是在resultSFSearchDataJSONParser这个回调函数里去根据参数获取结果,并更新到UI上。
      

  5.   


    有点明白了,resultSFSearchDataJSONParser确实是个异步加载类,跟AsyncTaskLoader差不多。
    最后想问的是我的UI刷新写在mainAdapter.java里,而resultSFSearchDataJSONParser回调是在data.java里,直接在data.java的resultSFSearchDataJSONParser()里更新UI好像不行。是不是应该把resultSFSearchDataJSONParser写在mainAdapter.java里才行?
      

  6.   


    有点明白了,resultSFSearchDataJSONParser确实是个异步加载类,跟AsyncTaskLoader差不多。
    最后想问的是我的UI刷新写在mainAdapter.java里,而resultSFSearchDataJSONParser回调是在data.java里,直接在data.java的resultSFSearchDataJSONParser()里更新UI好像不行。是不是应该把resultSFSearchDataJSONParser写在mainAdapter.java里才行?
    你创建了一个匿名类加载器,所以你在resultSFSearchDataJSONParser这个回调函数里可以直接访问mainAdapter的成员变量和局部变量,不需要把resultSFSearchDataJSONParser写在mainAdapter里。
      

  7.   


    有点明白了,resultSFSearchDataJSONParser确实是个异步加载类,跟AsyncTaskLoader差不多。
    最后想问的是我的UI刷新写在mainAdapter.java里,而resultSFSearchDataJSONParser回调是在data.java里,直接在data.java的resultSFSearchDataJSONParser()里更新UI好像不行。是不是应该把resultSFSearchDataJSONParser写在mainAdapter.java里才行?
    你创建了一个匿名类加载器,所以你在resultSFSearchDataJSONParser这个回调函数里可以直接访问mainAdapter的成员变量和局部变量,不需要把resultSFSearchDataJSONParser写在mainAdapter里。搞定了,又学了一招,非常感谢!!
    马上结贴给分。