0

私はにありListViewますActivity1。、データベースコードがあるOnItemClick別のアクティビティに移動し ています。Activity2

現在、問題はDBからのデータのフェッチに時間がかかることです。そのため、から Activity1に 移動している間Activity2、数秒間空白の画面が表示されます。

これを克服するために、私は試しProgressDialogましたProgressDialogが、まったく表示されていません。

アクティビティ2のコードスニペット:

public class Activity2 extends Activity implements Runnable {
@Override
public void onCreate(Bundle savedInstanceState) {
Thread thread = new Thread();
        thread.start();
        run();
}

@Override
    public void run() {
        plansDesc = dbMgr.chkRecord(
                "SELECT Description FROM SubPlan where Title='" + subTitle
                        + "'", "Description");

        ProgressDialog progDailog = ProgressDialog.show(
                SubPlanDescActivity.this, "Plan Information", "Loading...",
                true);
        try {
            if (plansDesc != "") {
                tvDesc.setText(Html.fromHtml(plansDesc));
            } else {
                tvDesc.setText(Html
                        .fromHtml("<b>No Information Available...</b>"));
            }
        } catch (Exception e) {
        }
        handler.sendEmptyMessage(0);
        progDailog.dismiss();
    }

private Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
    }
};

感謝の意を表します。

4

7 に答える 7

4

スレッドの代わりに AsyncTask を試す

以下のコードを参照してください

@Override
public void onCreate(Bundle savedInstanceState) {
   new ProgressTask().execute();
}

今すぐクラスを作成する

private class ProgressTask extends AsyncTask<String, Void, Boolean> {

  private ProgressDialog dialog = new ProgressDialog(HomeActivity.this);

  protected void onPreExecute() {
    this.dialog.setMessage("Please wait");
    this.dialog.show();
  }

  protected Boolean doInBackground(final String... args) {
    try {

        plansDesc = dbMgr.chkRecord(
            "SELECT Description FROM SubPlan where Title='" + subTitle
                    + "'", "Description");
        return true;
    } catch (Exception e) {
        Log.e("tag", "error", e);
        return false;
    }
  }

  @Override
  protected void onPostExecute(final Boolean success) {

    if (dialog.isShowing()) {
        dialog.dismiss();
    }

    if (success) {
        // display UI
        if (plansDesc != "") {
            tvDesc.setText(Html.fromHtml(plansDesc));
        } else {
            tvDesc.setText(Html
                    .fromHtml("<b>No Information Available...</b>"));
        }
    }
  }
}
于 2012-07-16T08:55:38.003 に答える
1

ハンドラー内の進行状況ダイアログを閉じる必要があります。

   private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
        progDailog.dismiss();
        }
    };

このようにコードを変更してみてください、

@Override
public void run() {
     handler.sendEmptyMessage(1);
    plansDesc = dbMgr.chkRecord(
            "SELECT Description FROM SubPlan where Title='" + subTitle
                    + "'", "Description");


    try {
        if (plansDesc != "") {
            tvDesc.setText(Html.fromHtml(plansDesc));
        } else {
            tvDesc.setText(Html
                    .fromHtml("<b>No Information Available...</b>"));
        }
    } catch (Exception e) {
    }
    handler.sendEmptyMessage(0);

}

そして、あなたのハンドラーはこのように、

private Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
      if(msg.what==0)
            {
             progDailog.dismiss();
               }
      if(msg.what==1)
      {
          ProgressDialog progDailog = ProgressDialog.show(
            SubPlanDescActivity.this, "Plan Information", "Loading...",
            true);
         }

    }
};
于 2012-07-16T08:39:45.013 に答える
1

これを書きます:

public class Activity2 extends Activity implements Runnable {
Thread thread;
ProgressDialog dialog;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(yourLayout);


dialog=ProgressDialog.show(this, "","Loading...",true);
dialog.show();
thread = new Thread(this);
thread.start();

}

public void run() {
        plansDesc = dbMgr.chkRecord(
            "SELECT Description FROM SubPlan where Title='" + subTitle
                    + "'", "Description");


    try {
        if (plansDesc != "") {
            tvDesc.setText(Html.fromHtml(plansDesc));
        } else {
            tvDesc.setText(Html
                    .fromHtml("<b>No Information Available...</b>"));
        }
    } catch (Exception e) {
    }

        handler.sendEmptyMessage(0);        
    }



 private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
              if(dialog!=null && dialog.isShowing()){
                 dialog.dismiss();
                 }
        }
   };
于 2012-07-16T08:43:04.597 に答える
0

データベース スレッドではなく、アクティビティで進行状況ダイアログを表示します。Handler を使用して、完了時にスレッドからメッセージを送信し、ダイアログを非表示にします。

于 2012-07-16T09:04:53.427 に答える
0

データをロードしたい場合は、AsyncTaskを使用してください。これが最善の解決策です。

于 2012-07-16T08:49:08.617 に答える
0

onCreate メソッドでは、「Runnable」要素 (ここでは「this」) をスレッド オブジェクト パラメータとして配置する必要があります。その後、「run」メソッドを呼び出す必要はありません。Thread オブジェクトから start() メソッドで自動的に呼び出されます。

コード例:

Thread thread = new Thread(this);
thread.start();

これで問題が完全に解決するかどうかはわかりませんが、これは実行可能なインターフェイスでスレッドを使用する良い方法です。

于 2012-07-16T08:52:36.200 に答える
0
    new AsyncTask<Void, Void, Cursor>() {

        protected void onPreExecute() {
            showProgress...
        }

        protected Cursor doInBackground(Void... structs) {
            Loading data...

            return result;
        }

        protected void onPostExecute(Cursor result) {
            Hide progress...

        }

    }.execute();
于 2012-07-16T08:55:05.373 に答える