有没有办法通过一个Intent和Parcelable传递一个DOM对象?(Is there any

2019-10-17 11:58发布

有没有办法通过通过一个意图和Parcelable一个JAXP节点或文档? JAXP没有实现Parcelable,所以答案很可能是--no。 有没有实现Parcelable任何DOM库? 有人可以提供一个工作的例子吗?

序列化是不是一种选择; 讨厌的性能损失。 在res / XML存储的数据是不是一种选择:它最终必须(由项目结束)在磁盘上加密。 Android的“编译” XML访问工具不支持解密整个XML。 当然,我可以用一个类做我自己。

下面是膨胀的XML我的起动代码。 我的目标是从一个ListView控件传递一个节点或到另一个文件,有效地向下钻取通过列表的DOM。

我的文档包含所有活动需要共享信息。 每个活动访问不同的节点,并提取新的信息。 我认为通过全球露出文件,但我不认为这将是安全的多种活动来访问它的方式。

此外,在工作代码下面我打算通过一个节点到第二ListActivity而不是一个字符串,只是还没有得到那么远。

package com.example

import java.io.File;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import android.app.ListActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.*;
import android.widget.AdapterView.OnItemClickListener;

public class JAXPListActivity extends ListActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Document doc = null;
        try {
            DocumentBuilderFactory factory = 
                        DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            doc = builder.parse(new File("/sdcard/example.xml"));

        } catch (Exception e) {
            e.printStackTrace(); //TO-DO: exception handling
        }

        NodeList nodes = doc.getChildNodes();
        String[] nodeList = new String[nodes.getLength()];

        for(int i = 0; i<nodes.getLength(); i++) {
            Node node = nodes.item(i);
            nodeList[i] = nodes.item(i).getNodeName();
        }

        this.setListAdapter(new ArrayAdapter<String>(this, 
                R.layout.list_item, 
                R.id.label, nodeList));

        ListView lv = getListView();

        lv.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view, 
                        int position, long id) {

                String nodeName = ((TextView) view).getText().toString();

                Intent i = new Intent(getApplicationContext(), 
                                JAXPNodeListActivity.class);

                i.putExtra("nodeName", nodeName);
                startActivity(i);
            }
        });
    }
}

Answer 1:

你可以简单地用一个Singleton类。 喜欢:

public class DomObjectManager{

private static DomObjectManager INSTANCE;
private  Document doc;

public static DomObjectManager getInstance(){

if(INSTANCE==null){
INSTANCE = new DomObjectManager();
}
return INSTANCE;
}
private DomObjectManager(){
}
//set the shared document;
public void setDocument(Document doc){
this.doc = doc;
}
public void getDocument(){
retunr doc;
}
//call to destroy before when you do not need the singleton any more.
public void destroy(){
INSTANCE == null;
}

}


文章来源: Is there any way to pass a DOM Object via an Intent and Parcelable?