2012-06-06 44 views
0

我有一個同步服務,我想要一個進度欄,因爲它需要> 1分鐘才能同步所有數據,而且我不想使用不確定的進度。我有一個Handler用於同步函數,並且引用並正確更新progressBar的進度,但UI不更新。處理程序內的ProgressBar更新

Handler handler = new Handler() { 
      @Override 
      public void handleMessage(Message msg) { 
       //Sync calls 
        updateProgress(getContext()); 
       } 
}; 
public static void updateProgress(Context c){ 
    layout = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    progress_view = layout.inflate(R.layout.sync_dialog, null); 

    mProgressStatus += mProgressStep; 
    mProgress = (ProgressBar) progress_view.findViewById(R.id.progress); 

    mProgress.setProgress(mProgressStatus); 
} 

我試過使用ASynchTask類沒有成功。任何幫助表示讚賞。

+0

你爲什麼要在updateProgress方法中使視圖膨脹?你有沒有嘗試使用runOnUiThread(new Runnable(){public void run(){}})在UI線程上更新它; – Guardanis

回答

1

你應該使用ThreadAsyncTask爲此,只有處理程序更新progressBar同時你同步所有的數據。

See this Example,並把您的同步代碼doInBackground method

2

讓我這使用權的Handler的例子。

Handler handler = new Handler() { 
     @Override 
     public void handleMessage(Message msg) { 
      bar.incrementProgressBy(5); 
      if (bar.getProgress() == 100) { 
       bar.setProgress(0); 
       Toast.makeText(ThreadsDemoActivity.this, "Progress is finished.", Toast.LENGTH_SHORT).show(); 
      } 
     } 
    }; 

然後,你必須創建ThreadonCreate方法(現在只能做一些模擬或工作)

@Override 
    public void onStart() { 
     super.onStart(); 
     bar.setProgress(0); 
     Thread backgroundThread = new Thread(new Runnable() { 
      public void run() { 
       try { 
        for (int i = 0; i < 20 && isRunning; i++) { 
         Thread.sleep(300); 
         handler.sendMessage(handler.obtainMessage()); 
        } 
       } 
       catch (Throwable t) { 

       } 
      } 
     }); 
     isRunning = true; 
     backgroundThread.start(); 
    } 

public void onStop() { 
     super.onStop(); 
     isRunning = false; 
    } 

還必須聲明和初始化progressBar

bar = (ProgressBar) findViewById(R.id.progBar) 

所以這是好的,但並非總是如此。更復雜的方法提供AsyncTask。這是非常複雜和強大的工具,當我向你推薦一些如此清晰的東西時,它是AnyncTask。它是通用類型,有一個名爲doInBackground()的方法,用於長時間任務並將您的任務轉移到後臺。有一條規則,你不能從後臺線程更新UI。您只能使用AsyncTask提供的onProgressUpdate()方法來更新UI。但足夠了,如果你想要的話,看看AsyncTask

Regards