0

我需要你的帮助,拜托。A 必须读取 XML 文件并将此数据加载到 ListView 中。使用 AsyncTask 执行此操作的最佳方法是什么?

private class ListaEventosTask extends AsyncTask<Void, Void, LinkedList<Map<String,?>>> {
    @Override
    protected LinkedList<Map<String,?>> doInBackground(Void... params) {

        xml = AuxXMLfunctions.getXML("http://xxx.com/list.php");
        doc = AuxXMLfunctions.XMLfromString(xml);
        List<Map<String,?>> listaItens = new LinkedList<Map<String,?>>(); 

        NodeList nodes = doc.getElementsByTagName("evento");

        for (int i = 0; i < nodes.getLength(); i++) {    
            Element e = (Element)nodes.item(i);
                listaItens.add(createItem(AuxXMLfunctions.getValue(e, "nome"),AuxXMLfunctions.getValue(e, "qtde_atividades") + " atividades programadas",AuxXMLfunctions.getValue(e, "codigo"),"0"));               
        }   

        return (LinkedList<Map<String, ?>>) listaItens;
    }       

这是 onPostExecute 代码:

    @Override 
    protected void onPostExecute(LinkedList<Map<String,?>> result) {

        adapter.addSection("Selecione o evento", new SimpleAdapter(ListViewEventos.this, result, R.layout.lista, new String[] {ITEM_TITLE, ITEM_CAPTION}, new int[] { R.id.list_complex_title, R.id.list_complex_caption}));
        list.setAdapter(adapter);
        ListViewEventos.this.setContentView(list);

        super.onPostExecute(result);

    }

所以现在,我有以下例外:

03-30 18:33:21.889: E/AndroidRuntime(605): Uncaught handler: thread main exiting due to uncaught exception
03-30 18:33:21.909: I/Teste(605): Evento não encontrado
03-30 18:33:21.909: E/AndroidRuntime(605): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{br.com.lwu.eventus/br.com.lwu.eventus.ListViewEventos}: java.lang.NullPointerException
03-30 18:33:21.909: E/AndroidRuntime(605):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2417)
03-30 18:33:21.909: E/AndroidRuntime(605):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
03-30 18:33:21.909: E/AndroidRuntime(605):  at android.app.ActivityThread.access$2200(ActivityThread.java:119)
03-30 18:33:21.909: E/AndroidRuntime(605):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
03-30 18:33:21.909: E/AndroidRuntime(605):  at android.os.Handler.dispatchMessage(Handler.java:99)
03-30 18:33:21.909: E/AndroidRuntime(605):  at android.os.Looper.loop(Looper.java:123)
03-30 18:33:21.909: E/AndroidRuntime(605):  at android.app.ActivityThread.main(ActivityThread.java:4363)
03-30 18:33:21.909: E/AndroidRuntime(605):  at java.lang.reflect.Method.invokeNative(Native Method)
03-30 18:33:21.909: E/AndroidRuntime(605):  at java.lang.reflect.Method.invoke(Method.java:521)
03-30 18:33:21.909: E/AndroidRuntime(605):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
03-30 18:33:21.909: E/AndroidRuntime(605):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
03-30 18:33:21.909: E/AndroidRuntime(605):  at dalvik.system.NativeStart.main(Native Method)
03-30 18:33:21.909: E/AndroidRuntime(605): Caused by: java.lang.NullPointerException
03-30 18:33:21.909: E/AndroidRuntime(605):  at android.content.ContextWrapper.getResources(ContextWrapper.java:80)
03-30 18:33:21.909: E/AndroidRuntime(605):  at android.view.View.<init>(View.java:1777)
03-30 18:33:21.909: E/AndroidRuntime(605):  at android.view.View.<init>(View.java:1821)
03-30 18:33:21.909: E/AndroidRuntime(605):  at android.view.ViewGroup.<init>(ViewGroup.java:290)
03-30 18:33:21.909: E/AndroidRuntime(605):  at android.widget.AdapterView.<init>(AdapterView.java:228)
03-30 18:33:21.909: E/AndroidRuntime(605):  at android.widget.AbsListView.<init>(AbsListView.java:508)
03-30 18:33:21.909: E/AndroidRuntime(605):  at android.widget.ListView.<init>(ListView.java:152)
03-30 18:33:21.909: E/AndroidRuntime(605):  at android.widget.ListView.<init>(ListView.java:148)
03-30 18:33:21.909: E/AndroidRuntime(605):  at android.widget.ListView.<init>(ListView.java:144)
03-30 18:33:21.909: E/AndroidRuntime(605):  at br.com.lwu.eventus.ListViewEventos.<init>(ListViewEventos.java:54)
03-30 18:33:21.909: E/AndroidRuntime(605):  at java.lang.Class.newInstanceImpl(Native Method)
03-30 18:33:21.909: E/AndroidRuntime(605):  at java.lang.Class.newInstance(Class.java:1479)
03-30 18:33:21.909: E/AndroidRuntime(605):  at android.app.Instrumentation.newActivity(Instrumentation.java:1021)
03-30 18:33:21.909: E/AndroidRuntime(605):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2409)
03-30 18:33:21.909: E/AndroidRuntime(605):  ... 11 more

下面是ListViewEventos的部分代码:

public class ListViewEventos extends Activity {

public final static String ITEM_TITLE   = "title";
public final static String ITEM_CAPTION = "caption";
public final static String ITEM_ID      = "id";
public final static String ITEM_LISTA   = "lista";

public Map<String,?> createItem(String title, String caption, String id, String lista) {
    Map<String,String> item = new HashMap<String,String>();
    item.put(ITEM_TITLE, title);
    item.put(ITEM_CAPTION, caption);        
    item.put(ITEM_ID, id);
    item.put(ITEM_LISTA, lista);

    return item;
}

String xml;
Document doc;
NodeList nodes;
String codEvento, nomeEvento;

AuxDAO         myDAO           = new AuxDAO(this);
AuxUtilitarios meusUtilitarios = new AuxUtilitarios(this);
ListView       list            = new ListView(this);
BaseAdapterListas adapter      = new BaseAdapterListas(this);

private ProgressDialog progressDialog;

@SuppressLint("NewApi")
@Override
public void onCreate(Bundle icicle) {
    super.onCreate(icicle);

    list.setBackgroundColor(Color.WHITE);
    list.setCacheColorHint(Color.WHITE);

    list.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> a, View v, final int position, long id) {

            @SuppressWarnings("unchecked")
            HashMap<String, String> objSelecionado = (HashMap<String, String>) list.getItemAtPosition(position);

            // 1 - Sincroniza a programação do evento selecionado:
            importaProgramacao(objSelecionado.get("id"));

            // 2 - Armazena o código da Unidade e o seu nome para serem passados para o Menu Principal:
            codEvento  = objSelecionado.get("id");
            nomeEvento = objSelecionado.get("title");
        }

    });            


    // Verifica se existe rede disponível:
    if (meusUtilitarios.haveInternet(this)) {

        try {
            ListaEventosTask asyncTask = new ListaEventosTask();
            asyncTask.execute(); 

        } catch (Exception e) {
            Log.i("Teste", "Erro: " + e);
        }


    }
    else {
        Toast.makeText(ListViewEventos.this, "Sem conexão à Internet", Toast.LENGTH_LONG).show();
        finish();
    }                       
}

private class ListaEventosTask extends AsyncTask<Void, Void, LinkedList<Map<String,?>>> {
    @Override
    protected LinkedList<Map<String,?>> doInBackground(Void... params) {

        xml = AuxXMLfunctions.getXML("http://kanegae.com.br/eventus/api/1.0/eventos.php");
        doc = AuxXMLfunctions.XMLfromString(xml);
        List<Map<String,?>> listaItens = new LinkedList<Map<String,?>>(); 

        NodeList nodes = doc.getElementsByTagName("evento");

        for (int i = 0; i < nodes.getLength(); i++) {    
            Element e = (Element)nodes.item(i);
                listaItens.add(createItem(AuxXMLfunctions.getValue(e, "nome"),AuxXMLfunctions.getValue(e, "qtde_atividades") + " atividades programadas",AuxXMLfunctions.getValue(e, "codigo"),"0"));               
        }   

        return (LinkedList<Map<String, ?>>) listaItens;
    }       

    @Override 
    protected void onPostExecute(LinkedList<Map<String,?>> result) {

        adapter.addSection("Selecione o evento", new SimpleAdapter(ListViewEventos.this, result, R.layout.lista, new String[] {ITEM_TITLE, ITEM_CAPTION}, new int[] { R.id.list_complex_title, R.id.list_complex_caption}));
        list.setAdapter(adapter);
        ListViewEventos.this.setContentView(list);

        super.onPostExecute(result);

    }       

}   

.
.
.
.   

}

解决。但是,我不知道这是否是最好的方法。见下面的代码:

public void onCreate(Bundle icicle) {
        super.onCreate(icicle);     

        myDAO           = new AuxDAO(this);
        meusUtilitarios = new AuxUtilitarios(this);     
        adapter         = new BaseAdapterListas(this);          
        list            = new ListView(this);

        list.setBackgroundColor(Color.WHITE);
        list.setCacheColorHint(Color.WHITE);

        list.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> a, View v, final int position, long id) {

                @SuppressWarnings("unchecked")
                HashMap<String, String> objSelecionado = (HashMap<String, String>) list.getItemAtPosition(position);

                // 1 - Sincroniza a programação do evento selecionado:
                importaProgramacao(objSelecionado.get("id"));

                // 2 - Armazena o código da Unidade e o seu nome para serem passados para o Menu Principal:
                codEvento  = objSelecionado.get("id");
                nomeEvento = objSelecionado.get("title");
            }

        });            


        // Verifica se existe rede disponível:
        if (meusUtilitarios.haveInternet(this)) {

            ListaEventosTask asyncTask = new ListaEventosTask();
            asyncTask.execute();                
        }
        else {
            Toast.makeText(ListViewEventos.this, "Sem conexão à Internet", Toast.LENGTH_LONG).show();
            finish();
        }                       
    }

    private class ListaEventosTask extends AsyncTask<Void, Void, Void> {
        @Override
        protected Void doInBackground(Void... params) {

            xml = AuxXMLfunctions.getXML("http://kanegae.com.br/eventus/api/1.0/eventos.php");
            doc = AuxXMLfunctions.XMLfromString(xml);
            List<Map<String,?>> listaItens = new LinkedList<Map<String,?>>(); 

            NodeList nodes = doc.getElementsByTagName("evento");

            for (int i = 0; i < nodes.getLength(); i++) {    
                Element e = (Element)nodes.item(i);
                    listaItens.add(createItem(AuxXMLfunctions.getValue(e, "nome"),AuxXMLfunctions.getValue(e, "qtde_atividades") + " atividades programadas",AuxXMLfunctions.getValue(e, "codigo"),"0"));               
            }

            adapter.addSection("Selecione o evento", new SimpleAdapter(ListViewEventos.this, listaItens, R.layout.lista, new String[] {ITEM_TITLE, ITEM_CAPTION}, new int[] { R.id.list_complex_title, R.id.list_complex_caption}));

            return null;
        }       

        @Override 
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);

            list.setAdapter(adapter);       
            ListViewEventos.this.setContentView(list);          
        }       

    }   
4

2 回答 2

0

目前,在从布局访问视图之前,您不需要setContentView为当前 Activity 设置布局。

第二个问题,您将需要ListView使用findViewById而不是创建调用默认构造函数的 ListView 类的实例来初始化实例。

public class ListViewEventos extends ListActivity {
//...your code here...
AuxDAO myDAO;
AuxUtilitarios meusUtilitarios;
ListView list;
BaseAdapterListas adapter;

private ProgressDialog progressDialog;

@SuppressLint("NewApi")
@Override
public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
// set Activity layout here

   myDAO= new AuxDAO(this);
   meusUtilitarios = new AuxUtilitarios(this);
   list =this.getListView();
   adapter= new BaseAdapterListas(this);
//....your code here...
于 2013-03-30T22:04:47.237 回答
0

解决。但是,我不知道这是否是最好的方法。见下面的代码:

public void onCreate(Bundle icicle) { super.onCreate(icicle);

    myDAO           = new AuxDAO(this);
    meusUtilitarios = new AuxUtilitarios(this);     
    adapter         = new BaseAdapterListas(this);          
    list            = new ListView(this);

    list.setBackgroundColor(Color.WHITE);
    list.setCacheColorHint(Color.WHITE);

    list.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> a, View v, final int position, long id) {

            @SuppressWarnings("unchecked")
            HashMap<String, String> objSelecionado = (HashMap<String, String>) list.getItemAtPosition(position);

            // 1 - Sincroniza a programação do evento selecionado:
            importaProgramacao(objSelecionado.get("id"));

            // 2 - Armazena o código da Unidade e o seu nome para serem passados para o Menu Principal:
            codEvento  = objSelecionado.get("id");
            nomeEvento = objSelecionado.get("title");
        }

    });            


    // Verifica se existe rede disponível:
    if (meusUtilitarios.haveInternet(this)) {

        ListaEventosTask asyncTask = new ListaEventosTask();
        asyncTask.execute();                
    }
    else {
        Toast.makeText(ListViewEventos.this, "Sem conexão à Internet", Toast.LENGTH_LONG).show();
        finish();
    }                       
}

private class ListaEventosTask extends AsyncTask<Void, Void, Void> {
    @Override
    protected Void doInBackground(Void... params) {

        xml = AuxXMLfunctions.getXML("http://kanegae.com.br/eventus/api/1.0/eventos.php");
        doc = AuxXMLfunctions.XMLfromString(xml);
        List<Map<String,?>> listaItens = new LinkedList<Map<String,?>>(); 

        NodeList nodes = doc.getElementsByTagName("evento");

        for (int i = 0; i < nodes.getLength(); i++) {    
            Element e = (Element)nodes.item(i);
                listaItens.add(createItem(AuxXMLfunctions.getValue(e, "nome"),AuxXMLfunctions.getValue(e, "qtde_atividades") + " atividades programadas",AuxXMLfunctions.getValue(e, "codigo"),"0"));               
        }

        adapter.addSection("Selecione o evento", new SimpleAdapter(ListViewEventos.this, listaItens, R.layout.lista, new String[] {ITEM_TITLE, ITEM_CAPTION}, new int[] { R.id.list_complex_title, R.id.list_complex_caption}));

        return null;
    }       

    @Override 
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);

        list.setAdapter(adapter);       
        ListViewEventos.this.setContentView(list);          
    }       

}   
于 2013-03-31T19:48:53.063 回答