试图弄清楚这个Android网络问题

时间:2014-01-06 03:27:19

标签: android exception networking

所以我试图解析论坛网站上的数据,这是我用于活动的代码:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    final ListView listview = (ListView) findViewById(R.id.listView);

    final List<String> list = formatTopicData(new TopicRetrievalTask().doInBackground(1));
    final StableArrayAdapter adapter = new StableArrayAdapter(this,
            android.R.layout.simple_list_item_1, list);
    listview.setAdapter(adapter);
}

private class StableArrayAdapter extends ArrayAdapter<String> {

    HashMap<String, Integer> mIdMap = new HashMap<String, Integer>();

    public StableArrayAdapter(Context context, int textViewResourceId,
                              List<String> objects) {
        super(context, textViewResourceId, objects);
        for (int i = 0; i < objects.size(); ++i) {
            mIdMap.put(objects.get(i), i);
        }
    }

    @Override
    public long getItemId(int position) {
        String item = getItem(position);
        return mIdMap.get(item);
    }

    @Override
    public boolean hasStableIds() {
        return true;
    }

}

我也有我的ASync任务:

 class TopicRetrievalTask extends AsyncTask<Integer, Void, List<TopicListView.TopicData>> {
 protected List<TopicListView.TopicData> doInBackground(Integer... page) {
    List<TopicListView.TopicData> topics = new ArrayList<TopicListView.TopicData>();
    Document doc;

    try {
        doc = Jsoup.connect("http://<site>/forums/?page=" + page[0])
                .userAgent("Mozilla")
                .get();

        Elements parsed = doc.select("tr[class=topic]");
        for (Element topic : parsed) {
            TopicListView.TopicData topicData = null;
            topicData.setTitle(topic.select("div").select("a").first().text());
            topicData.setUrl(topic.select("div").select("a").first().attr("href"));
            topicData.setAuthor(topic.select("small").select("a").first().text());
            topics.add(topicData);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    return topics;
}

出于某种原因,我仍然收到错误,说我正在主线程上进行网络连接,而我正在第8行调用异步任务。我知道为什么会这样做?

3 个答案:

答案 0 :(得分:0)

好像你试图在doinbackground()方法中操作ui。这就是导致你烦恼的原因。任何类型的ui操作都应该在onpostexecute()方法中完成。

答案 1 :(得分:0)

您正在直接呼叫doInBackground,如下所示:

new TopicRetrievalTask().doInBackground(1)

但你应该像这样开始AsyncTask,系统将在后台线程上调用你的doInBackground方法:

new TopicRetrievalTask().execute(1)

请注意,该任务实际上是 async - 您必须等待它完成才能直接使用结果,就像您尝试的那样。

答案 2 :(得分:0)

你不应该调用doInBackground,文档会告诉你必须调用execute()方法。

http://developer.android.com/reference/android/os/AsyncTask.html