无法使进度条工作

时间:2013-02-19 17:18:26

标签: android android-activity progress-bar

嗨,我有一个挑战,我不确定我做错了什么。

我有一个应用程序从Web服务获取数据并将其导入手机上的本地数据库。

我有一个名为ConnectServer的班级。这个类有一个名为updatedata的公共方法。在活动中使用数据时,我调用ConnectServer.updatedata()方法来“刷新”本地数据库。 Winthin我正在做以下活动:

final ProgressDialog dialog = ProgressDialog.show(this, "",this.getText(R.string.txt_fetch_data), true);

new Thread() {
    public void run() {
    try{
        ConnectServer.updatedata();
    } catch (Exception e) {
        Log.e("tag", e.getMessage());
    }
    // dismiss the progress dialog
    dialog.dismiss();
    }
}.start();

Sofar这么好。我试图实现的是,它不是平面对话框,而是显示进度条。

public class ConnectServer {
    public static String updatedata(Context _context){
        importData(callServer());
    } 
    private String callServer(){
      // https request to server returns JSON
    }

 private importData(String data){
     // loop thru data and insert / update local sqlite3 database
     //
     // TODO ----> update progress bar on each loop  <----
     //
}}

请帮忙。我花了好几个小时才弄清楚如何做到这一点

感谢

2 个答案:

答案 0 :(得分:1)

请注意,所有UI调用必须在UI线程上运行。

例如ProgressDialog.showdialog.dismiss()等来电。 要确保它们在UI线程上运行,您可以:

  • onCreateonClick ......等等的UI处理程序中调用它们。
  • 嵌入runOnUiThread
  • 中的内容
  • 如果你使用的是一个单独的线程,请使用ASyncTask并调用onPostExecuteonProgressUpdate
  • 中的那些

答案 1 :(得分:0)

我让它发挥作用

    dialog=new ProgressDialog(AssetListActivity.this);
    dialog.setTitle(getText(R.string.lbl_connecting));
    dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
    dialog.setProgress(0);
    dialog.setMax(0);
    dialog.show();

    final Runnable r = new Runnable(){
    public void run(){
    //update current gui after data is loaded
        updategui();}
    };
    new Thread() {
        public void run() {
        try{
        Looper.prepare();
        ConnectServer.updatedata(dialog);
        } catch (Exception e) {
        Log.e("tag", e.getMessage());
        }
        mHandler.post(r);
        dialog.dismiss();

        }
        }.start();

在ConnectServer类中,callServer()方法

                // vObject.getString("count") is the record count
            final int a = Integer.parseInt(vObject.getString("count"));
            if (dialog != null){
                Runnable task = new Runnable()
                {
                    public void run() 
                    {
                     dialog.setTitle(_context.getText(R.string.lbl_importing));
                     dialog.setMax(a);
                    }
                };
                new Handler(Looper.getMainLooper()).post(task);

            }