1

我一直试图让我的进度条视图在我的文件扫描器应用程序中工作,但我完全被活动、服务、线程和处理程序的正确组合所困扰。

结构如下: 我的 Activity 包含一个水平样式的 ProgressBar。在菜单项单击时,我生成了一个服务,它 onCreate(),这是我希望能够更新进度条的地方。

我的问题:我错过了什么?

  1. Activity "a" (with ProgressBar)
          2. "a".onOptionsItemSelected(): Spawn Service "b"
                   3. "b".onCreate(): Control the ProgressBar in "a" //这里是我的麻烦

进度条布局 (1):

<ProgressBar 
    style="?android:attr/progressBarStyleHorizontal"
    android:layout_height="wrap_content"
    android:max="100"
    android:progress="0"
    android:secondaryProgress="0" 
    android:layout_width="300px" 
    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");
}
4

2 回答 2

0

坦率地说,您的服务onCreate()是......有问题的:

  1. 不要尝试将小部件传递给服务
  2. 不要尝试从服务修改小部件
  3. 使用进度条时请尝试使用后台线程

关于#1 和#2,问问自己当用户旋转屏幕(例如,滑出 G1 的键盘)时会发生什么,并且服务持有的小部件变得无效。

就#3而言,启动本地服务不会自动创建后台线程。该服务将与活动和所有其他活动在同一线程上运行。如果您希望在后台线程上完成工作,请使用AsyncTask或创建线程并使用 Handler or post()or postDelayed()orrunOnUiThread()让后台线程安排 UI 更新在 UI 线程上发生。

于 2009-07-29T23:16:17.117 回答
0

无需做任何特别的事情,您的程序就在一个线程中运行,即 UI 线程,即操作系统的 UI 线程。程序中所做的任何事情都在 UI 线程中运行,除非您创建另一个线程以供其运行。该线程需要将任务的进度传达回 UI 线程(使用 Runnable、Handler 和 Thread 类)。然后主 UI 线程更新用户在 ProgressBar 上看到的内容。

最好的办法是花一个小时完成 SDK 线程示例。

开始的好地方在这里这里

于 2009-07-29T23:51:49.967 回答