【问题标题】:getter method of asynctask that run from other file从其他文件运行的 asynctask 的 getter 方法
【发布时间】:2013-06-01 00:56:28
【问题描述】:

我有两个文件 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;
    }

这是活动文件:

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;

    }

【问题讨论】:

    标签: java android


    【解决方案1】:

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

    【讨论】:

    • 谢谢。您的意思是让 AyncTask 类中的 onPostExecute 方法返回数据,然后在主 Activity 中调用 onPostExecute?
    • 不,onPostExecute()doInBackground() 接收返回的result,但现在您没有用您在定义AsyncTask 时声明的正确params 覆盖它,最后一个param 在类头中。所以它就像是你自己定义的函数
    • 如果它是一个内部类那么没问题,您可以将Activity的成员变量分配给结果。如果它是一个单独的文件,那么您需要在AsyncTask 构造函数中传递对该Activity 的引用,以从onPostExecute() 更新Activity
    • 我明白了,我更正了它们。如何在 Main Activity 中获得结果?
    • 向你的AsyncTask 添加一个构造函数,它接受Context 作为param,然后使用它从onPostExecute() 调用Activity 中的函数。然后,当您创建 AsyncTask 的实例时,传递它'this'
    【解决方案2】:

    下面的例子给你一个想法

    @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 的参数必须相同

    【讨论】:

      猜你喜欢
      • 2012-07-27
      • 2020-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多