如何实现进度对话[Android]

时间:2011-04-13 08:03:29

标签: android progressdialog

我遇到了一个问题,我有以下代码:

public void onCreate(Bundle savedInstanceState) {
    MyDialog = ProgressDialog.show(this, "Nalagam kanale" , "Prosimo počakaj ... ", true);
    MyDialog.show();
... }

实际上应该开始对话......但问题是当所有内容都被加载时会显示对话框...

我该如何解决?


实际代码

package com.TVSpored;

import java.util.ArrayList;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ListView;


public class Currently extends Activity{
static final int PROGRESS_DIALOG = 0;

private ArrayList<CurrentlyItem> currentItems;

private CurrentAdapter aa;
private ListView currentListView;

private JSONArray CurrentShows;
private Communicator CommunicatorEPG;

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


    CommunicatorEPG = new Communicator();
    currentItems = new ArrayList<CurrentlyItem>();

    if(currentItems == null)

    int resID = R.layout.current_item;
    aa = new CurrentAdapter(this, resID, currentItems);


    currentListView = (ListView)findViewById(R.id.currentListView);

    try {
        currentListView.setAdapter(aa);
    } catch (Exception e) {
        Log.d(" * Napaka", e.toString());
    }


    try {
        populateCurrent();
    } catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}
public void populateCurrent() throws JSONException
{
    CurrentShows = CommunicatorEPG.getCurrentShows(0);

    for (int i = 0; i < CurrentShows.length(); i++) 
    {
        JSONObject jsonObject = CurrentShows.getJSONObject(i);

          String start = jsonObject.getString("1");
          Integer duration = jsonObject.getInt("2");
          String title = jsonObject.getString("3");
          String epg_channel = jsonObject.getString("4");
          String channel_name = jsonObject.getString("5");
          CurrentlyItem newItem = new CurrentlyItem(1, 2, 3, 4, 5);
          currentItems.add(i, newItem);
    }
}
}

这是实际代码...我想在populateCurrent();AsyncTask进行同时我希望显示加载屏幕...现在已经尝试了几个小时但没有实际成功...我已成功显示加载屏幕并通过JSONArray,但无法更新列表视图......

感谢您的支持!

2 个答案:

答案 0 :(得分:1)

预期的行为......

显示对话框是UI线程的典型任务,但在完成onCreate方法之前,UI线程无法自由执行对话框创建...

两个解决方案:在单独的线程中创建对话框或在单独的线程中执行长任务。

这里有一些亮点: http://developer.android.com/guide/topics/ui/dialogs.html

答案 1 :(得分:0)

您可以等到设置活动的内容,直到完成进度对话框。

<强>更新

这将在async-task中运行您的命令:

new AsyncTask<Void, Void, Void> {
  protected Long doInBackground(Void... voids) {
    populateCurrent();
  }
}.execute()

然而,您可能必须确保再次更新GUI线程中的列表,并以某种方式告诉适配器列表已更新(因为您已将该列表提供给适配器):

runOnUiThread(new Runnable() {
  public void run() {
    currentItems.add(i, newItem);
    aa.notifyDataSetChanged();
  }
}

最好完全创建一个新列表并设置视图以查看该列表。