Android AsyncTask Threading - PullRequest
       13

Android AsyncTask Threading

0 голосов
/ 31 января 2012

Уважаемые программисты Stackoverflow,

Я создал приложение несколько месяцев назад, и оно работает безупречно.Однако на новом Android ICS он начал падать.Я посмотрел его и получил исключение Network On Main Thread.Я пытался переписать свой код, но я не могу заставить его работать так, как он работал ... Я пробовал AsyncTasking, но это тоже не сработало .. Пожалуйста, кто-нибудь может мне помочь ??

мой код:(если вам также нужен XMLFunctions.class, пожалуйста, дайте мне знать)

package test.lmc;

import java.util.ArrayList;
import java.util.HashMap;

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

import android.app.ListActivity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;

public class nieuwsflits extends ListActivity {

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.nieuwsflits);

    String xml = XMLfunctions.getXML();
    Document doc = XMLfunctions.XMLfromString(xml);

    int numResults = XMLfunctions.numResults(doc);

    if((numResults <= 0)){
        Toast.makeText(nieuwsflits.this, "Nog geen resultaten gevonden...", Toast.LENGTH_LONG).show();  
        finish(); 
    }

    ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>();

    NodeList nodes = doc.getElementsByTagName("message");
    int max = 10;
    //fill in the list items from the XML document
    for (int i = 0; i < nodes.getLength(); i++) {
        HashMap<String, String> map = new HashMap<String, String>();    

        Element e = (Element)nodes.item(i);
        map.put("id", XMLfunctions.getValue(e, "id"));
        map.put("datum", XMLfunctions.getValue(e, "datum"));
        map.put("message-text", XMLfunctions.getValue(e, "message-text"));
        map.put("url", XMLfunctions.getValue(e, "url"));

        mylist.add(map);
    }       


    //Make a new listadapter
    ListAdapter adapter = new SimpleAdapter(this, mylist , R.layout.listadapter,
                    new String[] { "message-text", "datum" },
                    new int[] { R.id.item_title, R.id.item_subtitle });

    setListAdapter(adapter);

    final ListView lv = getListView();
    lv.setTextFilterEnabled(true);  
    lv.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {              
            @SuppressWarnings("unchecked")
            HashMap<String, String> o = (HashMap<String, String>) lv.getItemAtPosition(position);
            String url = o.get("url");
            String check ="";
            if ((url == check)) {
                Toast.makeText(nieuwsflits.this, "Geen website gevonden...", Toast.LENGTH_LONG).show();
            }
            else {
            Intent i = new Intent(Intent.ACTION_VIEW);
            i.setData(Uri.parse(url));
            startActivity(i);
            }
            /** Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(o.get("url"))); 
            startActivity(browserIntent); 
            Toast.makeText(nieuwsflits.this, "ID '" + o.get("url") + "' was clicked.", Toast.LENGTH_LONG).show(); */

            }
        });


    }

}

Ответы [ 2 ]

0 голосов
/ 01 февраля 2012

Вам нужно будет кодировать свой пользовательский интерфейс, чтобы справиться с отсутствием действительных данных для начала. Затем, после того как AsyncTask завершит получение данных, он может запросить обновление пользовательского интерфейса для отображения действительных данных.

Я бы предложил, чтобы ваш пользовательский интерфейс первоначально отображал неопределенный индикатор выполнения (с вращающимися черточками), возможно, вместе с текстом «Загрузка ...», чтобы пользователь знал, что ему нужно ждать; они могут быть скрыты, когда пользовательский интерфейс имеет действительные данные для отображения.

0 голосов
/ 31 января 2012

Полагаю, в вашем методе XMLfunctions.getXML(); вы выполняете сетевой вызов для извлечения вашего XML.Это вызывается из onCreate (), который выполняется в потоке пользовательского интерфейса.ICS очень строго следит за тем, чтобы вам не разрешалось выполнять сетевые запросы в потоке пользовательского интерфейса, поэтому вам нужно переместить это в AsyncTask или Loader.

...