gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:34:26 25 4
gpt4 key购买 nike

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

public class XMLParser extends AsyncTask<Void, Void, ArrayList<Object>> {

ArrayList<String> groupItem = new ArrayList<String>();
ArrayList<Object> childItem = new ArrayList<Object>();
ArrayList<String> child = new ArrayList<String>();


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<Object> 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<String>();
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<String> getGroupItem() {

return groupItem;
}

public ArrayList<Object> getChildItem() {
return childItem;
}

这是 Activity 文件:

public class DevicesActivity extends ExpandableListActivity implements
OnChildClickListener {
ArrayList<String> groupItem = new ArrayList<String>();
ArrayList<Object> childItem = new ArrayList<Object>();

@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();
}

获取数组列表:

public void getArrayList(ArrayList<DataInterface> lst) {
finalList=lst;

}

最佳答案

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

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

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

@Override
protected void onPostExecute(ArrayList<Object> 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<Object> result){
mAct.yourMethod(result);

关于java - 从其他文件运行的 asynctask 的 getter 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16859299/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com