从其他文件运行的asynctask的getter方法

我有两个文件XMLParser,它从URL和Activity解析XML。 似乎getter方法不起作用。 我可以在XMLParser文件中输出arrayList的值。 但不在活动文件中。

public class XMLParser extends AsyncTask<Void, Void, ArrayList> { ArrayList groupItem = new ArrayList(); ArrayList childItem = new ArrayList(); ArrayList child = new ArrayList(); TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() { public java.security.cert.X509Certificate[] getAcceptedIssuers() { return null; } public void checkClientTrusted( java.security.cert.X509Certificate[] certs, String authType) { } public void checkServerTrusted( java.security.cert.X509Certificate[] certs, String authType) { System.out.println("authType is " + authType); System.out.println("cert issuers"); for (int i = 0; i < certs.length; i++) { System.out.println("\t" + certs[i].getIssuerX500Principal().getName()); System.out.println("\t" + certs[i].getIssuerDN().getName()); } } } }; @Override protected ArrayList doInBackground(Void... params) { try { SSLContext sc = SSLContext.getInstance("SSL"); sc.init(null, trustAllCerts, new java.security.SecureRandom()); HttpsURLConnection .setDefaultSSLSocketFactory(sc.getSocketFactory()); } catch (Exception e) { e.printStackTrace(); System.exit(1); } try { URL url = new URL(); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse(new InputSource(url.openStream())); doc.getDocumentElement().normalize(); NodeList nodeList = doc.getElementsByTagName("Device"); for (int i = 0; i < nodeList.getLength(); i++) { Element deviceElement = (Element) nodeList.item(i); groupItem.add(deviceElement.getAttribute("serial")); child = new ArrayList(); child.add(deviceElement.getAttribute("model")); child.add(deviceElement.getAttribute("asset")); child.add(deviceElement.getAttribute("location")); child.add(deviceElement.getAttribute("lastConnected")); childItem.add(child); } ; } catch (Exception e) { System.out.println("XML Pasing Excpetion = " + e); } return childItem; } protected void onPostExecute() { // here you will get the result } public ArrayList getGroupItem() { return groupItem; } public ArrayList getChildItem() { return childItem; } 

这是活动文件:

 public class DevicesActivity extends ExpandableListActivity implements OnChildClickListener { ArrayList groupItem = new ArrayList(); ArrayList childItem = new ArrayList(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); /** Create a new layout to display the view */ //setContentView(R.layout.activity_devices); //ExpandableListView expandbleLis = getExpandableListView(); //expandbleLis.setDividerHeight(2); //expandbleLis.setGroupIndicator(null); //expandbleLis.setClickable(true); startXMLParser(); System.out.println("size in Device "+groupItem.size()); System.out.println("size in Device "+childItem.size()); } private void startXMLParser() { XMLParser XMLTask = new XMLParser(); XMLTask.execute(null,null,null); groupItem=XMLTask.getGroupItem(); childItem=XMLTask.getChildItem(); } 

获取ArrayList:

 public void getArrayList(ArrayList lst) { finalList=lst; } 

由于AyncTask是异步的,所以当你调用方法来检索数据时,无法保证结果会存在,事实上,它可能不会。 在尝试访问这些变量之前,您需要确保任务已完成。

一种解决方案是将该数据传递给onPostExecute()Activity 。 如果此类是Activity的内部类,那么您可以拥有成员变量并在onPostExecute()或其他AsyncTask方法中分配它们。

此外,您应该在onPostExecute()声明中使用parameter类型,否则它将不会收到结果。 你应该添加@Override注释

 @Override protected void onPostExecute(ArrayList result) { // here you will get the result } 

在AsyncTask中创建一个构造函数来接收Context

 Activity mAct; public calss MyTask extends AsyncTask<...> // you know what to add here { public MyTask(Activity act) { mAct = act; } 

然后在onPostExecute()使用mContext来调用Activity函数

创建任务时

 MyTask task = new MyTask(this); // pass context to constructor taske.execute(// add params); public void onPostExecute(ArrayList result){ mAct.yourMethod(result); 

以下示例给出您的想法

 @Override protected void onPostExecute(ArrayList result) { // here you will get the result || This Must Be Same } \/ protected ArrayList doInBackground(String... params) 

doInBackground的返回类型和PostExecute的参数必须相同