更新原始活动中的集成进度条

时间:2009-07-29 22:56:45

标签: android multithreading service android-activity android-progressbar

我一直在努力让我的进度条视图在我的文件扫描程序应用程序中运行,而且我完全被活动,服务,线程和处理程序的正确组合所困扰。

这是结构:我的活动包含一个水平风格的ProgressBar。在菜单项上单击,我生成一个服务,onCreate(),这是我希望能够更新进度条的地方。

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

  1. 活动“a”(带ProgressBar)
    2.“a”.onOptionsItemSelected():生成服务“b”
    3.“b”.onCreate():在“a”中控制ProgressBar //这里是我遇到麻烦的地方
  2. 进度条的布局(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");
    }
    

2 个答案:

答案 0 :(得分:0)

说实话,你的服务onCreate()是......有问题的:

  1. 不要尝试将小部件传递给服务
  2. 请勿尝试修改服务中的小部件
  3. 使用进度条时尝试使用后台线程
  4. 就#1和#2而言,问问自己当用户旋转屏幕时会发生什么(例如,滑出G1的键盘),并且服务所持有的小部件变得无效。

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

答案 1 :(得分:0)

没有做任何特殊的事情,你的程序在一个线程,UI线程,操作系统的UI线程中运行。程序中完成的任何操作都在UI线程中运行,除非您为其运行创建另一个线程。该线程需要将任务的进度传递回UI线程(使用Runnable,Handler和Thread类)。然后主UI线程更新用户在ProgressBar上看到的内容。

这要做的最好的事情是花一个小时来完成SDK线程示例。

好的起点是herehere