有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

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;
    }

以下是活动文件:

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

获取ArrayList:

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

    }

共 (2) 个答案

  1. # 1 楼答案

    下面的例子给你一个想法

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

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

  2. # 2 楼答案

    由于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);