0

当某个条件(网站内容)为真时,我启用了这个 ToggleButton。

getSystemOnState(..) 连接到网络服务器,由于严格模式,这会导致异常。我使用 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 线程上执行该网络操作。或者这个类被广播接收器(它们是短暂的)调用。处理程序也可以传递消息,在这个例子中你并没有真正正确地使用它们。或者至少您可以看到所有线程、可运行文件和发布如何使所有内容都难以阅读。

您在这里需要的是 AsyncTask。

这是来自http://developer.android.com/reference/android/os/AsyncTask.html的 Google 示例

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

在您的情况下,您将希望第一个参数是您的主机字符串,您在后台执行的操作将执行您的检查和您的网络调用,以及 onPostExecute(在 UI 线程上运行)来更新您的视图。

于 2012-07-21T16:03:10.623 回答