异步任务需要很长时间才能加载

时间:2014-08-09 08:43:35

标签: android twitter android-asynctask

您好我开发了用于在列表中显示推文的应用程序.. 我从parse.com获得了所有的twitter ID 代码。

        ParseQuery<ParseObject> query = new ParseQuery<ParseObject>(
                "Twitter");

        ob = query.find();
        String[] strings = new String[ob.size()];
        // for (ParseObject imageupload : ob) {
        for (int i = 0; i < strings.length; i++) {
            ParseObject object = ob.get(i);

            strings[i] = object.getString("TwitterId");
            // images.add(map);
        }
        if (isNetworkAvailable()) {
            new DownloadTwitterTask(getActivity(), list, images, bar)
                    .execute(strings);
        }

然后我将一组twitter ID传递给异步任务

@Override
protected String[] doInBackground(final String... screenNames) {
    // String result = null;

    String rString[] = new String[screenNames.length];

    for (int i = 0; i < rString.length; i++) {
        rString[i] = getTwitterStream(screenNames[i]);
        //
    }
    return rString;
}

// onPostExecute convert the JSON results into a Twitter object (which is an
// Array list of tweets
@Override
protected void onPostExecute(String[] result) {
    Twitter twitter = new Twitter();
    for (int i = 0; i < result.length; i++) {
        twitter.addAll(jsonToTwitter(result[i]));

        Collections.sort(twitter, new SimpleDate());

    }

    adapter = new StreamListAdapter(context, twitter);
    list.setAdapter(adapter);
    bar.setVisibility(View.GONE);

}

问题是异步任务从所有twitter ID加载推文然后显示在列表中..
我想加载一些推文,然后在其他推文加载到后台时显示它

3 个答案:

答案 0 :(得分:0)

一种方法可能是你只给出数组的第一个说10个元素。 AsyncTask加载它并在onPostExecute中发布它,然后你用接下来的10个元素再次调用asyncTask等。只是不要从循环中启动asynctasks,因为推文的顺序可能是不可预测的。

另一种方法可能是挖掘AsynTask类的onProgressUpdate和publishProgress。 http://developer.android.com/reference/android/os/AsyncTask.html#publishProgress%28Progress...%29 我没试过这个,但值得一看。

答案 1 :(得分:0)

AsyncTask可以产生中间结果:实施onProgressUpdate并在doInBackground内致电publishProgress

答案 2 :(得分:0)

我不熟悉twitter API,但是如果你在for循环中得到每个数据部分,你可以使用publishProgress:

    for (int i = 0; i < rString.length; i++) {
        rString[i] = getTwitterStream(screenNames[i]);
        publishProgress(rString[i]);
    }

您在onProgressUpdate中收到已发布的字符串,该字符串在主App线程上调用:

 @Override
 protected void onProgressUpdate(String... progress) {
     adapter.add(progress[0]);
 }

这样,新数据一出现就会出现在列表中。