Android 来自Asynctask的Asynctask

Android 来自Asynctask的Asynctask,android,Android,我的应用程序需要在启动活动时解析XML文件。因此,我使用Asynctask来解析XML 解析XML文件后,我在doInBackground()方法中获得XML中测试用例的计数,并使用变量alTestCaseList来保持这个计数。 稍后在onPostExecute()方法中,我设置了ArrayAdapter并为列表注册了click侦听器 但是,当我单击列表中的任何测试用例时,我应该再次解析XML中的测试用例条目 因此,我相信为此,我必须再次使用AsyncTask。那么,我应该为第一个AsyncT

我的应用程序需要在启动活动时解析XML文件。因此,我使用Asynctask来解析XML

解析XML文件后,我在
doInBackground()
方法中获得XML中测试用例的计数,并使用变量
alTestCaseList
来保持这个计数。 稍后在
onPostExecute()
方法中,我设置了ArrayAdapter并为列表注册了click侦听器

但是,当我单击列表中的任何测试用例时,我应该再次解析XML中的测试用例条目

  • 因此,我相信为此,我必须再次使用AsyncTask。那么,我应该为第一个AsyncTask的
    onPostExecute()
    方法启动另一个AsyncTask吗
  • 有没有其他干净利落的方法
  • 我试图将
    setOnItemClickListener()
    放在
    onCreate()
    方法中,但它导致了一个致命的异常,消息是:
    “setOnItemClickListener(android.widget.AdapterView$OnItemClickListener)在一个空对象引用上”…。
  • 请给出你的建议

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_testcases);
    
        xmlHelp = new XmlHelper();
    
        ConfigParser confParser = new ConfigParser();
        confParser.execute();
    }
    
    private class ConfigParser extends AsyncTask<Void, Void, Void> {
        @Override
        protected Void doInBackground(Void... params) {
            alTestCaseList = xmlHelp.getNumberOfNodes();
            return null;
        }
    
        @Override
        protected void onPostExecute(Void v) {
            testCasesListView = (ListView) findViewById(R.id.lstTestCases);
            arrayAdapter = new ArrayAdapter(TestCasesActivity.this, android.R.layout.simple_list_item_1, alTestCaseList);
            testCasesListView.setAdapter(arrayAdapter);
            testCasesListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> adapter, View v, int position, long arg3) {
                    String value = (String) adapter.getItemAtPosition(position);
                    Log.d("QcTool", "Selected: " + value);
                }
            });
        }
    }
    
    @覆盖
    创建时受保护的void(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity\u测试用例);
    xmlHelp=新的XmlHelper();
    ConfigParser confParser=新的ConfigParser();
    confParser.execute();
    }
    私有类ConfigParser扩展异步任务{
    @凌驾
    受保护的Void doInBackground(Void…参数){
    alTestCaseList=xmlHelp.getNumberOfNodes();
    返回null;
    }
    @凌驾
    受保护的void onPostExecute(void v){
    testCasesListView=(ListView)findViewById(R.id.lstTestCases);
    arrayAdapter=新的arrayAdapter(TestCasesActivity.this,android.R.layout.simple\u list\u item\u 1,alTestCaseList);
    setAdapter(arrayAdapter);
    testCasesListView.setOnItemClickListener(新的AdapterView.OnItemClickListener(){
    @凌驾
    公共单击(适配器视图适配器,视图v,内部位置,长arg3){
    字符串值=(字符串)适配器.getItemAtPosition(位置);
    Log.d(“QcTool”,“选中:”+值);
    }
    });
    }
    }
    
    您可以使用异步任务执行类似的操作

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_testcases);
    
        testCasesListView = (ListView) findViewById(R.id.lstTestCases);
        testCasesListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapter, View v, int position, long arg3) {
                String value = (String) adapter.getItemAtPosition(position);
                Log.d("QcTool", "Selected: " + value);
    
                ParserNodeTask nodeTask = new ParserNodeTask();
                nodeTask.execute(value);
            }
        });
    
        xmlHelp = new XmlHelper();
    
        ParserNumberOfNodesTask numberOfNodesTask = new ParserNumberOfNodesTask();
        numberOfNodesTask.execute();
    }
    
    private class ParserNumberOfNodesTask extends AsyncTask<Void, Void, Void> {
        @Override
        protected Void doInBackground(Void... params) {
            alTestCaseList = xmlHelp.getNumberOfNodes();
            return null;
        }
    
        @Override
        protected void onPostExecute(Void v) {
            arrayAdapter = new ArrayAdapter(TestCasesActivity.this, android.R.layout.simple_list_item_1, alTestCaseList);
            testCasesListView.setAdapter(arrayAdapter);
        }
    }
    
    private class ParserNodeTask extends AsyncTask<Void, Void, Void> {
         @Override
        protected Void doInBackground(String... params) {
            String value = params[0];
            //TODO : parse the selected node
        }
    
        @Override
        protected void onPostExecute(Void v) {
            //TODO: dunno what you need to do later
        }
    }
    
    @覆盖
    创建时受保护的void(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity\u测试用例);
    testCasesListView=(ListView)findViewById(R.id.lstTestCases);
    testCasesListView.setOnItemClickListener(新的AdapterView.OnItemClickListener(){
    @凌驾
    公共单击(适配器视图适配器,视图v,内部位置,长arg3){
    字符串值=(字符串)适配器.getItemAtPosition(位置);
    Log.d(“QcTool”,“选中:”+值);
    ParserNodeTask nodeTask=新的ParserNodeTask();
    nodeTask.execute(值);
    }
    });
    xmlHelp=新的XmlHelper();
    ParserNumberOfNodesTask numberOfNodesTask=新的ParserNumberOfNodesTask();
    numberOfNodesTask.execute();
    }
    私有类ParserNumber OfNodeTask扩展了AsyncTask{
    @凌驾
    受保护的Void doInBackground(Void…参数){
    alTestCaseList=xmlHelp.getNumberOfNodes();
    返回null;
    }
    @凌驾
    受保护的void onPostExecute(void v){
    arrayAdapter=新的arrayAdapter(TestCasesActivity.this,android.R.layout.simple\u list\u item\u 1,alTestCaseList);
    setAdapter(arrayAdapter);
    }
    }
    私有类ParserNodeTask扩展了AsyncTask{
    @凌驾
    受保护的Void doInBackground(字符串…参数){
    字符串值=参数[0];
    //TODO:解析所选节点
    }
    @凌驾
    受保护的void onPostExecute(void v){
    //托多:不知道你以后需要做什么
    }
    }
    

    尽管由于许多原因异步任务并不理想(但更容易实现)。您也许应该看看装载机或服务(即)

    以下是我对解决方案的看法。将数据作为参数传递给任务,并在获取列表时通知适配器。 请参阅注释以了解更多解释。请注意,此方法不会处理AsyncTask通常在配置更改等情况下出现的问题

    然后可以创建另一个ParseXmlTask类,该类可以在OnItemClicked方法中调用

    private ListView testCasesListView;
    private ArrayAdapter arrayAdapter;
    private List<String> testCasesList;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_testcases);
    
        //Init the list - it's empty but your task will fill it.
        testCasesList = new ArrayList<>();
    
        //Init your listView
        testCasesListView = (ListView) findViewById(R.id.lstTestCases);
    
        //Add adapter to the listView
        arrayAdapter = new ArrayAdapter(TestCasesActivity.this, android.R.layout.simple_list_item_1, alTestCaseList);
    
        //Add your click event
        testCasesListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> adapter, View v, int position, long arg3) {
                    //When clicked, do something awesome
                    String value = (String) adapter.getItemAtPosition(position);
                    Log.d("QcTool", "Selected: " + value);
    
                    //Create and start parseXmlTask here
                }
            });
    
        xmlHelp = new XmlHelper();
    
        //Pass in your callback as an argument
        ConfigParserTask confParser = new ConfigParserTask(new OnConfigParserTaskCompleted(){
            public void onConfigParserTaskCompleted(List<String> result){
                //Simply refresh the list
                testCasesList.clear();
                testCasesList.addAll(result);
                //Let the adapter know that the list has changed
                //Then update the list view
                arrayAdapter.notifyDataSetChanged();
            }
        });
        confParser.execute(xmlHelp);
    }
    
    //It's better to pass in the info to the task as arguments than it is to rely on
    //field variables 
    private class ConfigParserTask extends AsyncTask<XmlHelper, Void, List<String>> {
        private OnConfigParserTaskCompleted listener;
    
        public ConfigParser(OnConfigParserTaskCompleted listener){
            this.listener = listener;
        }
    
        @Override
        protected Void doInBackground(XmlHelper... params) {
            //Do what you need to in the background
            //Get your nodes then return it here
            List<String> nodes = params[0].getNumberOfNodes();
            return nodes;
        }
    
        @Override
        protected void onPostExecute(List<String> result) {
            //pass the result to the callback 
           listener.onConfigParserTaskCompleted(result);
        }
    }
    
    //Callback to let your activity/fragment know when
    //the task is complete
    public interface OnConfigParserTaskCompleted{
        public void onConfigParserTaskCompleted(List<String> result);
    }
    
    私有列表视图testCasesListView;
    专用阵列适配器阵列适配器;
    私人列表测试用例列表;
    @凌驾
    创建时受保护的void(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity\u测试用例);
    //初始化列表-它是空的,但您的任务将填充它。
    testCasesList=newArrayList();
    //初始化你的列表视图
    testCasesListView=(ListView)findViewById(R.id.lstTestCases);
    //将适配器添加到listView
    arrayAdapter=新的arrayAdapter(TestCasesActivity.this,android.R.layout.simple\u list\u item\u 1,alTestCaseList);
    //添加您的点击事件
    testCasesListView.setOnItemClickListener(新的AdapterView.OnItemClickListener(){
    @凌驾
    公共单击(适配器视图适配器,视图v,内部位置,长arg3){
    //点击后,做一些很棒的事情
    字符串值=(字符串)适配器.getItemAtPosition(位置);
    Log.d(“QcTool”,“选中:”+值);
    //在此处创建并启动parseXmlTask
    }
    });
    xmlHelp=新的XmlHelper();
    //将回调作为参数传递
    ConfigParserTask confParser=新建ConfigParserTask(新建OnConfigParserTaskCompleted(){
    onConfigParserTaskCompleted上的公共无效(列表结果){
    //只需刷新列表
    testCasesList.clear();
    testCasesList.addAll(结果);
    //让适配器知道列表已更改
    //然后更新列表视图
    arrayAdapter.notifyDataSetChanged();
    }
    });
    有限公司