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