当类中的布尔值发生更改时更新GUI

时间:2011-03-09 07:47:50

标签: android

每当布尔值在另一个类中发生更改时,我都会尝试让Activity更新一个ImageView。

因此我有一些从我的第一个 onCreate()开始的计时器

private void startTimer() {
    mHandler.removeCallbacks(mUpdateTimeTask);
    mHandler.postDelayed(mUpdateTimeTask, 2000); // first run after 2 secs
}

private Runnable mUpdateTimeTask = new Runnable() {
    public void run() {
        connectionControl.checkNetworkState();
        System.out.println("online?: " + connectionControl.isOnline());
        mHandler.postDelayed(this, 15000); // repeat every x/1000 secs
    }
};

我的班级 ConnectionControl 有一个布尔值,无论我的应用是否可以访问特定的http主机,都会设置为true或false。 现在我的问题是:如何在我的Activity中实现ImageView的自动更改以显示布尔值? 我已经看过Observer-Pattern,EventListener,BroadcastReciever,但我一直在寻找合适的解决方案。 另外,我想在其他活动中使用收听。

到目前为止工作的是为每个活动启动/停止计时器事物,并在 run()方法中进行ImageView更新。但我的猜测是,必须有一种绕过冗余的方法。

2 个答案:

答案 0 :(得分:0)

我认为您正在搜索 AsyncTask ,通过使用它,您可以异步调用webservice,在成功调用webservice之后,我们可以处理获取的数据。

请完成本文:http://developer.android.com/resources/articles/painless-threading.html

我认为你需要这个:(来自android.com)

public void onClick(View v) {
  new DownloadImageTask().execute("http://example.com/image.png");
}

private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
     protected Bitmap doInBackground(String... urls) {
         return loadImageFromNetwork(urls[0]);
     }

     protected void onPostExecute(Bitmap result) {
         mImageView.setImageBitmap(result);
     }
 }

有关 AsyncTask 的详情,请点击链接:http://developer.android.com/reference/android/os/AsyncTask.html

答案 1 :(得分:0)

我是这样做的。

我为自定义标题栏创建了一个布局文件,它有一个ImageView。

<merge xmlns:android="http://schemas.android.com/apk/res/android">
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent" android:layout_height="wrap_content">

    <ImageView android:id="@+id/title_statusimg"
        android:layout_width="wrap_content" android:layout_height="wrap_content"
        android:src="@drawable/connected" android:layout_centerVertical="true"
        android:layout_alignParentRight="true" />

    </RelativeLayout>
</merge> 

我将其包含在我想要使用的每个活动布局文件中。

<include layout="@layout/titlebar" />

另外,我创建了一个扩展Activity的StatusActivity。它接收一个广播,只要后台线程检测到与网络服务器的连接发生变化,就会发送广播。

public class StatusActivity extends Activity {

private String CONNECTION_STATUS = "app.CONNECTION_STATUS";
private ImageView conn;

@Override
protected void onResume() {
    super.onResume();
    IntentFilter iFilter = new IntentFilter(CONNECTION_STATUS);
    registerReceiver(mBroadcastReceiver, iFilter);

    conn = (ImageView) findViewById(R.id.title_statusimg);
    if (ConnectionControl.isOnline()) {
        conn.setImageResource(R.drawable.connected);
    } else {
        conn.setImageResource(R.drawable.nconnected);
    }
}

@Override
protected void onPause() {
    super.onPause();
    unregisterReceiver(mBroadcastReceiver);
}


private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (ConnectionControl.isOnline()) {
            conn.setImageResource(R.drawable.connected);
        } else {
            conn.setImageResource(R.drawable.nconnected);
        }
    }
};

}

每个使用此状态图像的活动都会扩展StatusActivity而不是Activity。

希望我能覆盖所有内容,至少对我来说是有效的。