0

こんにちは、私は自分が何を間違っているのかわからないという課題を抱えています。

Web サービスからデータをフェッチし、電話のローカル データベースにインポートするアプリケーションがあります。

というクラスがありConnectServerます。このクラスには、 という public メソッドがあり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.showまたはのような呼び出しdialog.dismiss()。それらがUIスレッドで実行されることを確認するには、次のことができます。

  • onCreateonClick...などのUIハンドラーでそれらを呼び出します。
  • それらを埋め込んだrunOnUiThread
  • 自分のように別のスレッドを使用する場合は、ASyncTaskを使用して、onPostExecuteまたはでそれらを呼び出します。onProgressUpdate
于 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 に答える