每当布尔值在另一个类中发生更改时,我都会尝试让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更新。但我的猜测是,必须有一种绕过冗余的方法。
答案 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。
希望我能覆盖所有内容,至少对我来说是有效的。