异步任务进度对话框不消失

3

你好,我正在加载用户帐户的推文以在列表视图中显示。现在我想让用户在等待时了解发生了什么。我已经实现了Async Task,但出于某种原因,onPostExcecute从未被调用。这就是为什么对话框永远不会被删除的原因。

有人可以给我一些提示吗?我做错了什么?

如果需要,我可以发布我的TweetAdapterClass

这是我的AsyncClass

public class ProgressTask extends AsyncTask<Void, Void, Void> {


    @Override
    protected void onPreExecute() {
        dialog.setTitle("Even geduld...");
        dialog.setMessage("De tweets worden ingeladen...");
        dialog.show();
    }

    protected void onPostExecute() {
        try {
            if (dialog.isShowing()) {
                adaptor = new TweetListAdaptor(MainActivity.this, R.layout.tweetitem, loadTweets());
                setListAdapter(adaptor);
                dialog.dismiss();
            }
        } catch (Exception e) {
        }
    }

    @Override
    protected Void doInBackground(Void... arg0) {

        return null;

    }
}

LoadTweets看起来像这样:

private ArrayList<Tweets> loadTweets() {
    ArrayList<Tweets> tweets = new ArrayList<Tweets>();
    try {
        HttpClient hc = new DefaultHttpClient();
        HttpGet get = new HttpGet(
                "http://search.twitter.com/search.json?q=JobXXL_be&rpp=10");
        // HttpGet get = new
        // HttpGet("http://search.twitter.com/search.json?q=Stijn_messiaen&rp=10");

        HttpResponse rp = hc.execute(get);
        if (rp.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
            String result = EntityUtils.toString(rp.getEntity());
            JSONObject root = new JSONObject(result);
            JSONArray sessions = root.getJSONArray("results");
            for (int i = 0; i < sessions.length(); i++) {
                JSONObject session = sessions.getJSONObject(i);
                Tweets tweet = new Tweets();
                tweet.setTweet(session.getString("text"));
                tweet.setUser(session.getString("from_user"));
                // datum vertalen
                String date = session.getString("created_at").substring(5,
                        16);
                String[] arrDate = date.split(" ");
                int id = this.getResources().getIdentifier(
                        arrDate[1].toString(), "string",
                        this.getPackageName());
                String maand = getResources().getString(id);
                date = arrDate[0].toString() + " " + maand + " "
                        + arrDate[2].toString();

                tweet.setDate(date);
                tweets.add(tweet);
            }
        }
    } catch (Exception e) {
        Log.e("TwitterFeedActivity", "Error loading JSON", e);
    }
    return tweets;
}

编辑:我将我的LoadTweets()方法添加到了我的doInBackgroundMethod中,这解决了我的问题!


你的 loadTweets() 方法长什么样子? - nicholas.hauschild
5个回答

0
在编程方面,可以在活动中使用 onCreateDialog(int id) 来创建 ProgressDialog。在 AsyncTask 中调用:
MainActivity.this.showDialog(PROGRESS_DIALOG_ID);

解雇:

MainActivity.this.dismissDialog(PROGRESS_DIALOG_ID);

对话框与活动的上下文相关联。当活动被重新创建时,对话框也应该被重新创建,但此时对话框的实例不同。


0

onPostExecute()与声明的Void不匹配。我正在路上,所以就我目前的想法而言,请考虑:

protected void onPostExecute(Void result)

更多这里。


我尝试了这个,但不幸的是它没起作用。声明有什么问题?除了args中的arg0被更改,我看不出有任何区别。 - Hannelore
@Hannelore 我正在路上,所以我无法测试我的代码。我已经编辑了我的答案。 - JAL

0
尝试在您的AsyncTask类所在的主类中声明ProgressDialog dialog,并仅在AsyncTask类中调用dialog.showdialog.dismiss方法。

我在onCreate()方法中这样做了,并初始化了对话框,但不幸的是它没有起作用。 - Hannelore

0

我曾经遇到过同样的问题,当时是因为onPostExecute与声明不匹配...你可以尝试像这样写:protected Void onPostExecute(Void... arg0)

接下来要做的事情是在代码中加入Log.d("Your app", "Location of this code");并检查哪一部分没有在Log文件中执行...

希望你能找到解决方案...


0
嗯,这里有两件事情需要注意...
1)为什么你的onPostExecute没有像onPreExecute和doInBackground一样被覆盖?
2)为什么doInBackground在onPostExecute之后?通常的顺序是
onPreExecute doInBackground onPostExecute

我知道这条评论有点老了,但是我想告诉你,在Java中,@Override注释是可选的。 - Vitor M. Barbosa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接