0

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

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

我有一堂课叫ConnectServer. 这个类有一个名为的公共方法updatedata。在活动中使用数据时,我调用该ConnectServer.updatedata()方法来“刷新”本地数据库。在活动中,我正在执行以下操作:

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();

到目前为止,一切都很好。我想要实现的是,它显示的不是平面对话框,而是一个进度条。

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  <----
     //
}}

请帮忙。我一直在花费数小时来弄清楚如何做到这一点

谢谢

4

2 回答 2

1

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

例如调用类似ProgressDialog.showor dialog.dismiss()。为了确保它们在 UI 线程上运行,您可以:

  • 调用 UI 处理程序中的那些,例如onCreateonClick...等...
  • 嵌入那些runOnUiThread
  • 如果您使用看起来像的单独线程,请使用 ASyncTask 并调用它们onPostExecuteonProgressUpdate
于 2013-02-19T17:30:38.843 回答
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);

            }
于 2013-02-25T18:15:29.180 回答