0

特定の条件(Webサイトコンテンツ)がtrueの場合に有効になるこのToggleButtonがあります。

getSystemOnState(..)はWebサーバーに接続しますが、これにより、厳密モードのために例外が発生します。Handlerクラスの使用方法の何が問題になっていますか?

public class ReceiverToggleButton extends ToggleButton {
 private Runnable mTicker;
 private Handler mHandler;
 private boolean mTickerStopped = false;
 private String rxhost = null;
 private Context context = null;

 public ReceiverToggleButton(Context context) {
    super(context);
    this.context = context;
    updateOnOffState(context);
 }

 private void updateOnOffState(final Context cxt) {
    Runnable r = new Runnable() {
        public void run() {
            rxhost = cxt.getResources().getString(R.string.host_receiver);
            mHandler = new Handler();
            mTicker = new Runnable() {
                public void run() {
                    if (mTickerStopped) {
                        return;
                    }

                    boolean isSystemOn = getSystemOnState(rxhost); // connects to webserver
                    setChecked(isSystemOn);
                    invalidate();
                    long now = SystemClock.uptimeMillis();
                    long next = now + 1000 * 10; // check every 10s
                    mHandler.postAtTime(this, next);
                }

            };
            mHandler.post(mTicker);
        }
    };
    new Thread(r).start();
 }
}
4

1 に答える 1

1

UIスレッドでそのネットワーク操作を実行しようとしているため、厳密モードで問題が発生しています。または、このクラスはBroadcastReceiver(短命)によって呼び出されています。ハンドラーもメッセージを渡すためのものであり、この例では実際には正しく使用されていません。または、少なくとも、すべてのスレッド、実行可能ファイル、および投稿によって、すべてが読みにくくなることがわかります。

ここで必要なのはAsyncTaskです。

これがGoogleの例ですhttp://developer.android.com/reference/android/os/AsyncTask.htmlから

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
     protected Long doInBackground(URL... urls) {
         int count = urls.length;
         long totalSize = 0;
         for (int i = 0; i < count; i++) {
             totalSize += Downloader.downloadFile(urls[i]);
             publishProgress((int) ((i / (float) count) * 100));
             // Escape early if cancel() is called
             if (isCancelled()) break;
         }
         return totalSize;
     }

     protected void onProgressUpdate(Integer... progress) {
         setProgressPercent(progress[0]);
     }

     protected void onPostExecute(Long result) {
         showDialog("Downloaded " + result + " bytes");
     }
 }

new DownloadFilesTask().execute(url1, url2, url3);

この場合、最初のパラメーターをホスト文字列にし、バックグラウンドでdoを実行してチェックとネットワーク呼び出しを実行し、onPostExecute(UIスレッドで実行)を使用してビューを更新します。

于 2012-07-21T16:03:10.623 に答える