更新原始活动中的集成进度条
Posted
技术标签:
【中文标题】更新原始活动中的集成进度条【英文标题】:Update integrated progress bar in original activity 【发布时间】:2010-11-15 06:28:58 【问题描述】:我一直在尝试让我的进度条视图在我的文件扫描器应用程序中工作,但我完全被活动、服务、线程和处理程序的正确组合所困扰。
结构如下:我的 Activity 包含一个水平样式的 ProgressBar。单击菜单项时,我会生成一个 Service,它是 onCreate(),我希望能够在其中更新进度条。
我的问题:我错过了什么?
-
活动“a”(带有 ProgressBar)
2.“a”.onOptionsItemSelected():生成服务“b”
3.“b”.onCreate():控制“a”中的ProgressBar //这就是我的麻烦
进度条布局(一):
<ProgressBar
style="?android:attr/progressBarStyleHorizontal"
android:layout_
android:max="100"
android:progress="0"
android:secondaryProgress="0"
android:layout_
android:layout_marginLeft="10px"
android:id="@+id/progress_horizontal"
/>
"a".onOptionsItemSelected(2):
public boolean onOptionsItemSelected(MenuItem item)
if (svc == null)
android.util.Log.v("@@@@@@@@@@@@@@@@@@@@@", "starting");
svc = new Intent(this, DoScan.class);
// done in "a".onCreate()
// hmap = new HashMap();
// hmap.put("tv", tv);
svc.putExtra("hmap", hmap);
startService(svc);
break;
"b".onCreate() (3):
@Override
public void onCreate()
super.onCreate();
//startThread();
TextView tv = (TextView) Peekaboo.hmap.get("tv");
tv.append("cocktail");
【问题讨论】:
我正在寻找的是 Activity 与生成的服务器进行通信的一种方式.. 【参考方案1】:坦率地说,您的服务的 onCreate()
是...有问题的:
-
不要尝试将小部件传递给服务
不要尝试从服务修改小部件
在使用进度条时尽量使用后台线程
关于#1和#2,问问自己当用户旋转屏幕(例如,滑出G1的键盘)时会发生什么,并且服务持有的小部件变得无效。
就#3而言,启动本地服务不会自动创建后台线程。该服务将与活动和所有其他活动在同一线程上运行。如果您希望在后台线程上完成工作,请使用 AsyncTask
或创建线程并使用 Handler 或 post()
或 postDelayed()
或 runOnUiThread()
让后台线程安排在 UI 上发生 UI 更新线程。
【讨论】:
【参考方案2】:无需做任何特别的事情,您的程序就在一个线程中运行,即 UI 线程、操作系统的 UI 线程。程序中所做的任何事情都在 UI 线程中运行,除非您创建另一个线程供其运行。该线程需要将任务的进度传达回 UI 线程(使用 Runnable、Handler 和 Thread 类)。然后主 UI 线程更新用户在 ProgressBar 上看到的内容。
最好的办法是花一个小时完成 SDK 线程示例。
好的起点是here 和here。
【讨论】:
以上是关于更新原始活动中的集成进度条的主要内容,如果未能解决你的问题,请参考以下文章
如何为 Windows 7 编写进度条以在任务栏上进行自我更新?