Bài đăng phổ biến

Thứ Sáu, 7 tháng 12, 2012

TẠI SAO PHẢI LÀM VIỆC THEO NHÓM

Nguồn tham khảo:

"Tại sao chúng ta phải làm việc theo nhóm?
Đơn giản vì không ai là hoàn hảo, làm việc theo nhóm sẽ tập trung những mặt mạnh của từng người và bổ sung cho nhau. Hơn nữa, chẳng ai có thể cáng đáng hết mọi việc.

Đặc điểm của nhóm làm việc là gì?
- Các thành viên làm việc tương tác lẫn nhau vừa hướng đến mục đích cá nhân và mục tiêu chung của cả đội. Họ hiểu rất rõ rằng những mục tiêu đó chỉ có thể đạt kết quả tốt nhất bằng cách hỗ trợ lẫn nhau
- Các thành viên hiểu sự quan trọng trong việc chịu trách nhiệm với phần việc của mình trong nhóm
- Các thành viên hợp tác với nhau và đóng góp tài năng và kinh nghiệm của mình vào sự thành công của cả đội.
- Các thành viên lấy sự thật làm căn cứ cho thành công của cả đội và khuyến khích các thành viên bộc lộ ý kiến của bản thân, thay đổi quan điểm và nêu câu hỏi.
- Các thành viên rất trung thực, tôn trọng và lắng nghe ý kiến của mọi thành viên.
- Các thành viên được khuyến khích áp dụng kĩ năng và kiến thức của mình và ngược lại các thành viên còn lại cũng vậy để từ đó đóng góp vào thành công của cả nhóm.
- Các thành viên coi những xung đột là một phần của cuộc sống và họ phản ứng lại việc đó bằng cách coi đó là một cơ hội để biết đến một ý tưởng và quan điểm mới. Mọi thành viên muốn cùng nhau giải quyết những vấn đề đó.
- Các thành viên bình đẳng trong việc bàn bạc đưa ra quyết định cuối cùng nhưng mỗi thành viên đều hiểu rằng người đứng đầu (trưởng nhóm) là người đưa ra quyết định cuối cùng nếu cả đội không thể thống nhất được với nhau.
Khi lập nhóm làm việc, chúng ta cần phải thực hiện các yêu cầu sau:

1. Một tập hợp của những người có tâm huyết, kiến thức và kinh nghiệm về lĩnh vực liên quan
Trong sản xuất, chúng ta có rất nhiều thành phần người lao động, có người có kiến thức cao, người thì có sự sáng tạo, người có kinh nghiệm, người nắm rõ công việc, thao tác... Việc lập nhóm tốt hơn hết nên hội đủ những người với nhiều thành phần khác nhau và chúng ta đừng vội cho rằng những ngừơi ít học sẽ không đóng góp được gì cho nhóm. Hãy hiểu rằng, mỗi người đều có những khả năng tiềm ẩn mà không phải ai cũng khai thác được. Và việc lựa chọn ai là thành viên trong nhóm nên căn cứ vào mục tiêu dự án mà nhóm phải thực hiện là gì.

2. Phân công phù hợp với khả năng
Sự phân công công việc phù hợp sẽ giúp mọi người làm việc dễ dàng hơn. Các công việc phải có tính chất liên hệ, gắn kết với nhau chứ không phải độc lập. Chúng ta đừng ngại khi muốn tìm cách phát huy khả năng tiềm ẩn của một thành viên nào đó bằng cách giao cho anh ta những công việc mới. Điều đó sẽ giúp bạn nhìn nhận rõ khả năng của họ.

3. Đảm bảo sự công bằng
Ai cũng có quyền phát biểu ý kiến của mình và chúng ta không nên phản bác sự nhiệt tình của họ khi mà chúng ta chưa xác định được rõ ràng bằng thực tế rằng, ý tưởng đó là sai. Dù ý kiến không phù hợp đi chăng nữa, sự chê bai không bao giờ là phương pháp thích hợp để nhận xét một ý kiến.

4. Xây dựng lòng tin giữa các thành viên
Hãy khẳng định rằng các thành viên là như nhau khi tham gia vào nhóm, chỉ trừ người trưởng nhóm. Mọi người đều có trình độ, sự hiểu biết và tay nghề khi tham gia vào nhóm. Mỗi người có thế mạnh riêng, tích cách riêng. Do đó, ý kiến, ý tưởng của mỗi người đều có giá trị trong quá trình làm việc. Tuyệt đối không có sự "vạch lá tìm sâu" hay "con sâu làm rầu nồi canh". Hãy nhớ rằng, thành quả chỉ đến từ sự cống hiến và tin tưởng lẫn nhau của các thành viên trong nhóm.

5. Mục tiêu rõ ràng
Tất cả các thành viên trong nhóm đều hiểu mục tiêu chung mà tập thể của họ phải đạt đến là gì? Thông tin đến với mọi người chính xác như nhau.

6. Trưởng nhóm
Đây là người có nhiệm vụ dẫn dắt tập thể trong quá trình thực hiện dự án. Do đó, người này phải có khả năng kêu gọi và điều khiển mọi người. Những thành viên trong nhóm, dù chức vụ có lớn hơn, cũng phải tuân thủ theo những yêu cầu của người trưởng nhóm. Nếu bạn muốn đào tạo hay tìm kiếm những nhân tài lãnh đạo tương lai cho tổ chức, bạn hãy mạnh dạn trao cho những người trẻ và theo bạn là có khả năng phát triển.

7. Thời hạn dự án phải hoàn thành
Những dự án có thời hạn phải hoàn thành luôn là điều kiện thuận lợi để thực hiện.

8. Động viên để duy trì
Nếu bạn là người lãnh đạo, hãy thường xuyên đến tìm hiểu, hỏi thăm về tiến độ dự án, tình hình của nhóm. Điều này kích thích nhóm cùng nhau làm việc tốt hơn khi họ cảm nhận được sự quan tâm thật sự từ lãnh đạo và cũng như một sự nhắc nhở của bạn đối với công việc của nhóm.

9. Khen thưởng kịp thời và rõ ràng
Hãy xác định rõ những phần thưởng mà tổ chức sẽ dành cho tập thể khi họ đạt được mục tiêu.Đảm bảo rằng sự khen thưởng đó dành cho cả tập thể. Hạn chế tối đa việc khen thưởng một cá nhân khi mà thành quả của công việc đến tự sự cật lực làm việc của cả nhóm, dù rằng, theo bạn, người đó là xuất sắc nhất; bạn hãy nhớ rằng, không có sự cống hiến của những người khác, thành quả sẽ không có.

10. Hành động
Cho cả nhóm biết rằng, họ hãy tự tin thực hiện những ý tưởng mà cả nhóm đã thống nhất thành hành động cụ thể. Sau mỗi lần không thành, cả nhóm sẽ gắn kết và tin tưởng nhau hơn và đương nhiên, mọi người sẽ học hỏi được nhiều điều hơn. Chắc chắn rằng, sự thất bại sẽ không được quy cho riêng cá nhân nào. Đó là tập thể.

11. Trang bị kỹ năng làm việc nhóm
Để việc quản lý nhóm và nhóm hoạt động hiệu quả, bạn phải chắc chắn rằng người trưởng nhóm đã được trang bị những kiến thức, kỹ năng cần thiết để kết hợp mọi người, khai thác, phân tích ý kiến, ý tưởng, công việc của mọi người.

Các nguyên tắc khi làm việc, thảo luận nhóm

1. Sự bình đẳng
Mọi ngừơi trong nhóm đều là thành viên như nhau, không có ai hơn ai, quyền phát biểu thuộc về mọi người, ý kiến của mọi người được tôn trọng như nhau, không có sự chê bai. Khi có sự nể nang xuất hiện, hãy dập tắt nó ngay. Điều này đòi hỏi người trưởng nhóm quyết đoán và mạnh mẽ. Đó cũng là điều kiện để trở thành một người lãnh đạo.

2. Tinh thần tích cực
Mọi thành viên tham gia vào nhóm đều phải tích cực đóng góp ý kiến, kinh nghiệm, kiến thức của mình vào công việc chung của nhóm. Khuyến khích mọi ngừoi đóng góp hơn là ngồi ỳ hoặc không có ý kiến gì. Điều này đòi hỏi kỹ năng của ngừơi trưởng nhóm.

3. Xác định trách nhiệm, công việc rõ ràng
Khi đã thống nhất những điều cần thực hiện, mọi thành viên trong nhóm đều đựơc giao công việc để thực hiện theo kế hoạch đã thống nhất một cách cụ thể, rõ ràng.

4. Không có chủ nghĩa cá nhân
Có nhiều người luôn tự cho những ý kiến của mình là đúng. Người trưởng nhóm hãy cho cả nhóm biết đâu là ý kiến hữu ích thông qua các kỹ năng phân tích tính hiệu quả của từng ý kiến. Tránh những cuộc cải vã không cần thiết.

5. Sự lắng nghe
Đây là một kỹ năng trong giao tiếp, nhất là khi thảo luận nhóm. Sự lắng nghe tiếp thu ý kiến, ý tưởng của mọi thành viên sẽ giúp buổi thảo luận hiệu quả. Ngừơi phát biểu cảm thấy được tôn trọng và mạnh dạn đóng góp ý kiến của mình nhiều hơn.

6. Biến ý tưởng thành hành động
Mọi cuộc thảo luận đều phải dẫn đến hành động cụ thể. Bắt buộc các hành động đó phải được cả tập thể đều hiểu và nhất trí. Ở đây đòi hỏi vai trò chỉ huy và khả năng của người trưởng nhóm rất lớn.

Thứ Hai, 5 tháng 11, 2012

Vòng đời của AndEngine Game, Sự khác nhau giữa SimpleBaseGameActivity và BaseGameActivity

What is the different between extends SimpleBaseGameActivity and BaseGameActivity and BaseActivity?

SimpleBaseGameActivity có trong GLES2 nó giống với BaseGameActivity trong AndEngine GLES1 và nó chỉ moves 1 method loadComplete tới là chạy tự động.

BaseGameActivity trong GLES2 nó không giống BaseGameActivity trong GLES1. Trong GLES2 nó yêu cầu bạn sử dụng CallBack trước khi bạn chuyển từ method này tới method tiếp theo.


Launch Game
  1. onLoadEngine()
  2. onResume()
  3. onLoadResources()
  4. onLoadScene()
  5. onLoadComplete()
  6. onGameResumed()
Trong game trở về màn hình chính của device(HomeScreen)

  1. onPause()
Để trở lại game

  1. onResume()
  2. onGameResumed()
Exit game với this.finish()

  1. onPause()
  2. onDestroy()

hope! That's good for you.

Sửa lỗi Code 43 trên Win 7


cắm usb vô,

mở start > run > devmgmt.msc > tìm dòng unknown device

bấm chuột phải lên nó chọn uninstall.

rút usb cắm qua cổng khác cho nó nhận lại

sau đó tải file này về chạy

Code:
http://download.microsoft.com/download/5/2/3/52323091-3F94-4076-B544-F76B9B1247BD/Mats_Run.devices.exe

Chủ Nhật, 4 tháng 11, 2012

Tạo và quản lý Scenes

Như tôi đã đề cập trong bài trước http://opengles-android.blogspot.com/2012/11/thiet-ke-game-cua-ban-usefull-concept.html Để dễ dàng hơn chỉ cần tạo 1 activity với nhiều Scenes thay vì nhiều Activitys để xử lý những phần khác nhau của game. Tôi sẽ tư vấn theo cách sử dụng những Scenes như thế này giống như tôi đã posted trong diagram ở previous tutorial.

Và bây giờ phát sinh câu hỏi, làm như thế nào để quản lý tốt Scenes? Tốt nhất là các bạn nên tạo Enum với các kiểu Scenes.

Ví dụ bạn cần 4 cảnh:


  1. Splash Screen  (Shown while loading resource)
  2. Menu Scene (Xuất hiện sau khi load resource)
  3. Option Scene
  4. Game Scene
Vì vậy hãy tạo Enum với các kiểu Scenes: Ví dụ

  1. public enum SceneType
  2.  {
  3.        SPLASH,
  4.        MENU,
  5.        OPTIONS,
  6.        GAME,
  7.  }
  8.  
  9.  public SceneType currentScene = SceneType.SPLASH;



Và sau đó trong khi lựa chọn các Scenes khác nhau, luôn luôn nhớ rằng để thay đổi kiểu Enum của Scene. vì vậy chúng ta theo dõi kiểu nào Scene hiện thời được biểu diễn, Ví dụ sau sẽ lựa chọn từ Splash Screen tới Menu Screen.

     mEngine.setScene(menuScene);
     currentScene = SceneType.MENU;


Chúng ta có thể viết đè onKeyDown để dễ dàng điều khiển lựa chọn các Scenes trong khi phím Back được nhấn:


  1. @Override
  2. public boolean onKeyDown(int keyCode, KeyEvent event)
  3. {  
  4.      if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() ==KeyEvent.ACTION_DOWN)
  5.      {          
  6.           switch (currentScene)
  7.           {
  8.                case SPLASH:
  9.               break;
  10.                case MENU:
  11.                     System.exit(0);
  12.                     break;
  13.                case OPTIONS:
  14.                     mEngine.setScene(menuScene);
  15.                     currentScene = SceneType.MENU;
  16.                     break;
  17.                case GAME:
  18.                     mEngine.setScene(gameScene);
  19.                     currentScene = SceneType.MENU;
  20.                     break; 
  21.           }
  22.      }
  23.      return false;
  24. }

Đoạn code trên thực hiện những gì? nó kiểm tra nut Back được nhấn, và lựa chọn giữa các Scenes (Phụ thuộc trên những cảnh hiện thời) và trong trường hợp này:

  • Trong khi game đang loading (Splash Screen) thì không thực hiện sự kiện gì cả
  • Khi ở trong Menu Scenes, chúng ta đơn giản thoát từ game
  • Khi nó ở trong lựa chọn Options Scene, chúng ta lựa chọn trở lại tới Menu Scene
  • khi nó ở trong Game Scenes. giống như ở trên. 


Với cách này chúng ta dễ dàng theo dõi các Scenes. và lựa chọn chúng cho activity cuối cung.







Thiết kế Game của bạn (USEFULL concept "pattern"

nguồn: https://sites.google.com/site/matimdevelopment/how-to-design-your-game-useful-concept-pattern

Trong bài này tôi sẽ mô tả ý kiến chủ quan của tôi về việc làm thế nào để có kế hoạch và phát triển trò chơi của riêng bạn sử dụng AndEngine. Cái này rất hữu ích cho những người mới phát triển để bắt đầu. Tại sao tôi nghĩ rằng quan trọng là phải có kế hoạch ngắn hạn trước khi bắt đầu phát triển ứng dụng của bạn. Nếu bạn có kế hoạch thực hiện thì nó rễ dàng đoán trước được mọi việc ngay từ đầu. (Từ kinh nghiệm cá nhân tôi đã phát triển trò chơi mà không có kế hoạch gì cả -->Đó là sự đau đớn, và tôi phải cặm cụi viết lại nhiều bộ phận của game trong khi chỉ cần thêm một số tính năng quan trọng). Với một kế hoạch và cấu trúc dự án tốt sẽ rất hữu ích cho tương lại. Viết game đặc biệt một mình thực sự rất tốn thời gian, để làm cho nó dễ dàng hơn với project của bạn. Hãy tham khảo một số lời khuyên của tôi:

Vì vậy! Cho phép tôi nói rằng, bạn phải có 1 ý tưởng tuyệt vời với một trò chơi mới, và những gì phát triển tiếp theo trong tương lai. Theo tôi hãy suy nghĩ thật kỹ trước khi bắt đầu coding. Hãy nghĩ những gì và các lớp gì mà bạn cần thiết, những gì sẽ phải khởi tạo, Cấu trúc của dự án tốt là chìa khóa để thành công.


  • Write it somewhere, think about structure
  • Try to draw classes diagram, will be easier to imagine everything latter.
  • Explore Engine, for sure many things already implemented, just profit
  • Convert your ideas into code.

Many Activitys versus Scenes

Rõ dàng là không nhiều Activitys trong hầu hết các trường hợp

  • Menu Activity
  • Options Activity
  • Game Activity
Nhưng nó là cách tốt để tạo ra nhiều Activitys (Đây không phải là ý kiến của tôi). Đầu tiên là trong thời gian loading resource (thời gian giữa lúc game hoạt động, vì vậy bạn phải load tại nguyên) va nó khá khó giải quyết với nhiều Activitys bạn sẽ kết thúc với nhiều vấn để với việc truy cập tới các đối tượng và các phần game khác nhau. Điều đó giải thích tại sao thật tốt nếu có 1 Activity theo cách của mình, sẽ dễ dàng hơn để phát triển . Với cách này, bạn chỉ cần load tài nguyên một lần (Lúc khởi chạy ban đầu) từ kinh nghiệm nó có nhiều lợi thế như cần ít thời gian hơn để chuyển đổi, và bộ nhớ cũng ít hoạt động hơn. Bạn cũng có thể tái sử dụng các đối tượng theo cách này.

Lược đồ sau là cái nhìn tổng quát cho ứng dụng của bạn.




Lược đồ trên chỉ ra có 4 cảnh trong một Activity. Với cách này, chúng ta loadresource chỉ 1 lần, sau khi load xong chúng ta đơn giản tời Menu Scene và play.






























































AsyncTask Trong Android

Nguồn: http://www.24h-mobile.com/data/AsyncTask-Trong-Android.html

1. Giới thiệu


Một chương trình chạy trên Android có thể sẽ có cấu trúc phức tạp. Yêu cầu kết nối đến Server, CSDL, tải file … Nếu chúng ta xử lý các công việc đó trên Main Thread sẽ làm ứng dụng có vẻ chạy chậm hay treo vì chúng làm gián đoạn việc cập nhật, xử lý trên GUI. Có nhiều cách để giải quyết vấn đề này: sử dụng Service, Thread hay đơn giản hơn là dùng Async Task (Asynchronous Task).

2. Class AsyncTask

Class này cho phép chúng ta chạy tác vụ nền và sau đó trả lại kết quả cập nhật lên GUI mà không phải động đến Thread/handler khá rắc rối và đau đầu.

Sử dụng:

private class MyTask extends AsyncTask <Params, Progress, Result>{

    @Override
        protected void onPreExecute() {
            
        }
        
        @Override
        protected Result doInBackground(Params param) {
            
        }
        
        @Override
        protected void onProgressUpdate(Progress progress) {
          
        }
        
        @Override
        protected void onPostExecute(Result result) {
           
        }


Trong đó:

- Params: các parameters được truyền vào khi task được thực hiện
- Progress: Các thông tin về tiến độ task được trả về khi task chạy
- Result: Kết quả cuối cùng khi task xong.
- Không phải khi nào cũng phải sử dụng đầy đủ chúng. Để đánh dấu không dùng ta sử dụng kiểu Void

VD:

private class SearchSrv extends AsyncTask<Void, Void, PlacesList>


4 bước thực hiện task (Không nhất thiết phải đầy đủ)

onPreExecute()  báo thay đổi đến UI ngay khi task chạy, thường được dùng để hiện progressbar chẳng hạn.
doInBackground(Params...) Thực hiện khi bước 1 xong. Dùng để xử lý Task, có thể tốn nhiều thời gian. Kết quả trả về sẽ được đưa qua bước 4. 
onProgressUpdate(Progress...), cập nhật tiến độ Task
onPostExecute(Result), trả về kết quả cập nhật lên UI.

3. Chú ý

- Task instance và instance.execute() phải được tạo và chạy  trong UI Thread.
- Không gọi các phương thức onPreExecute, doInBackGround,onProgressUpdate, onPostExecute thủ công.
- Task chỉ có thể được chạy 1 lần (Nếu khởi chạy lần thứ 2 sẽ có exception)





Thứ Bảy, 3 tháng 11, 2012

Splash Creen trong android

Có rất nhiều ứng dụng, đặc biệt là Game. Khi khởi chạy game thì đầu tiên màn hình hiển thị thông thường là Splash Screen, mà màn hình hiển thị lúc này thường là giới thiệu tác giả hoặc giới thiệu logo của nhà sản xuất...

Bài này tôi sẽ hướng dẫn các bạn cài đặt Splash Screen một cách thật đơn giản, nó hiển thị lúc khởi động và sẽ chạy trong một khoảng thời gian ngắn nào đó.

OK! let's start

1. Create Launcher activity (Đây sẽ là SplashScreen của bạn)
2. Tạo main Activity của bạn (Màn hình chính của game)
3. Cài đặt Splash với một layout chứa 1 progressBar
4. Bắt đầu a Task để load Resource của bạn
5. Gọi lại Plash của bạn mà bạn vừa mới finish();
6. Start yout app
Đầu tiên chúng ta bắt đầu với SplashActivity. Cái này chưa ProgressBar mà biểu diễn ứng dụng của bạn loading.
SplashActivity.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package com.blundell.tut.ui;
 
import com.blundell.tut.R;
import com.blundell.tut.task.LoadingTask;
import com.blundell.tut.task.LoadingTask.LoadingTaskFinishedListener;
 
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.ProgressBar;
 
public class SplashActivity extends Activity implements LoadingTaskFinishedListener {
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Show the splash screen
        setContentView(R.layout.activity_splash);
        // Find the progress bar
        ProgressBar progressBar = (ProgressBar) findViewById(R.id.activity_splash_progress_bar);
        // Start your loading
        new LoadingTask(progressBar, this).execute("www.google.co.uk"); // Pass in whatever you need a url is just an example we don't use it in this tutorial
    }
 
    // This is the callback for when your async task has finished
    @Override
    public void onTaskFinished() {
        completeSplash();
    }
 
    private void completeSplash(){
        startApp();
        finish(); // Don't forget to finish this Splash Activity so the user can't return to it!
    }
 
    private void startApp() {
        Intent intent = new Intent(SplashActivity.this, MainActivity.class);
        startActivity(intent);
    }
}


Bạn chú ý. Lớp trên cài đặt giao diện LoadingTaskFinishedListener sử dụng giao diện là 1 cách của việc giao tiếp giữa các lớp. Bạn đang nói "Tôi có khả năng nhận về một thông điệp mà trông giống ...this" Bởi vì ASyncTask có 1 trường mà là 1 đối tượng của giao diện đó nó có thể bất chợt phát ra những thông điệp đó và Activity của bạn sẽ nhận được chúng . Tiếp theo là ASyncTask

LoadingTask.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package com.blundell.tut.task;
 
import android.os.AsyncTask;
import android.util.Log;
import android.widget.ProgressBar;
 
public class LoadingTask extends AsyncTask<String, Integer, Integer> {
 
    public interface LoadingTaskFinishedListener {
        void onTaskFinished(); // If you want to pass something back to the listener add a param to this method
    }
 
    // This is the progress bar you want to update while the task is in progress
    private final ProgressBar progressBar;
    // This is the listener that will be told when this task is finished
    private final LoadingTaskFinishedListener finishedListener;
 
    /**
     * A Loading task that will load some resources that are necessary for the app to start
     * @param progressBar - the progress bar you want to update while the task is in progress
     * @param finishedListener - the listener that will be told when this task is finished
     */
    public LoadingTask(ProgressBar progressBar, LoadingTaskFinishedListener finishedListener) {
        this.progressBar = progressBar;
        this.finishedListener = finishedListener;
    }
 
    @Override
    protected Integer doInBackground(String... params) {
        Log.i("Tutorial", "Starting task with url: "+params[0]);
        if(resourcesDontAlreadyExist()){
            downloadResources();
        }
        // Perhaps you want to return something to your post execute
        return 1234;
    }
 
    private boolean resourcesDontAlreadyExist() {
        // Here you would query your app's internal state to see if this download had been performed before
        // Perhaps once checked save this in a shared preference for speed of access next time
        return true; // returning true so we show the splash every time
    }
 
 
    private void downloadResources() {
        // We are just imitating some process thats takes a bit of time (loading of resources / downloading)
        int count = 10;
        for (int i = 0; i < count; i++) {
 
            // Update the progress bar after every step
            int progress = (int) ((i / (float) count) * 100);
            publishProgress(progress);
 
            // Do some long loading things
            try { Thread.sleep(1000); } catch (InterruptedException ignore) {}
        }
    }
 
    @Override
    protected void onProgressUpdate(Integer... values) {
        super.onProgressUpdate(values);
        progressBar.setProgress(values[0]); // This is ran on the UI thread so it is ok to update our progress bar ( a UI view ) here
    }
 
    @Override
    protected void onPostExecute(Integer result) {
        super.onPostExecute(result);
        finishedListener.onTaskFinished(); // Tell whoever was listening we have finished
    }
}


LoadingTask là bộ khung của ASyncTask, chúng ta cài đặt 1 callBack trong constructor. sau đó kiểm tra nếu Resources của ta tải về mà tồn tại,......nếu không. Một khi chúng ta tải về kết thúc chúng ta thông báo lại Listener.
Nhiệm vụ này bắt trước.....kiểu như giả loadding Nhưng ở bài này nó không phải là trọng tâm. Bạn nhận thấy mỗi vòng lặp được hoàn tất chúng sẽ update progressbar. Bạn hãy nhớ rằng 1 progressbar là 1 Android View Object. View Object là 1 phần của UI vì vậy có thể update trên UIThread. Vì vậy chúng ta sử dụng onProgressUpdate() method mà android cung cấp chắc chắn chạy trên UIThead.

Khi updating 1 progressbar bạn gửi nó giá trị từ 0-100 và giá trị này sẽ là progressbar của nó. Trong ví dụ này chúng ta chạy qua 1 vòng lặp đếm tới 10 do đó mỗi vòng lặp sẽ là 10% của progressbar.

VD: In AndEngine

  1. public class MainGameActivity extends BaseGameActivity {
  2.         // ===========================================================
  3.         // Final Fields
  4.         // ===========================================================
  5.         // ===========================================================
  6.         // Constants
  7.         // ===========================================================
  8.         private static final int CAMERA_WIDTH = 480;
  9.         private static final int CAMERA_HEIGHT = 800;
  10.         // ===========================================================
  11.         // Fields
  12.         // ===========================================================
  13.         protected Camera mCamera;
  14.         // splash scene
  15.         protected Scene mSplashScene;
  16.         private BitmapTextureAtlas mSplashBackgroundTextureAtlas;
  17.         private TextureRegion mSplashBackgroundTextureRegion;
  18.         // menu scene
  19.         protected Scene mMenuScene;
  20.         // ...
  21.         // ===========================================================
  22.         // Methods for/from SuperClass/Interfaces
  23.         // ===========================================================
  24.         @Override
  25.         public Engine onLoadEngine() {
  26.                 this.mCamera = new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT);
  27.                 return new Engine(new EngineOptions(true, ScreenOrientation.PORTRAIT,new RatioResolutionPolicy(CAMERA_WIDTH, CAMERA_HEIGHT),this.mCamera).setNeedsSound(true));
  28.         }
  29.         @Override
  30.         public void onLoadResources() {
  31.                 BitmapTextureAtlasTextureRegionFactory.setAssetBasePath("gfx/");
  32.                 mSplashBackgroundTextureAtlas = new BitmapTextureAtlas(512, 1024, TextureOptions.NEAREST);
  33.                 mSplashBackgroundTextureRegion =BitmapTextureAtlasTextureRegionFactory.createFromAsset(mSplashBackgroundTextureAtlas,this"splash.jpg", 0, 0);
  34.                 mEngine.getTextureManager().loadTextures(mSplashBackgroundTextureAtlas);
  35.         }
  36.         @Override
  37.         public Scene onLoadScene() {
  38.                 mSplashScene = new Scene();
  39.                 mSplashScene.setBackgroundEnabled(false);
  40.                 mSplashScene.attachChild(new Sprite(0, 0, mSplashBackgroundTextureRegion));
  41.                 return this.mSplashScene;
  42.         }
  43.        
  44.         @Override
  45.         public void onLoadComplete() {
  46.                 mEngine.registerUpdateHandler(new TimerHandler(0.01f, newITimerCallback() {
  47.                         @Override
  48.                         public void onTimePassed(final TimerHandler pTimerHandler) {
  49.                                 mEngine.unregisterUpdateHandler(pTimerHandler);
  50.                                 loadResources();
  51.                                 loadScenes();
  52.                                 mEngine.setScene(mMenuScene);
  53.                         }
  54.                 }));
  55.         }
  56.         // ===========================================================
  57.         // Methods
  58.         // ===========================================================
  59.         public void loadResources() {
  60.                 // menu resources
  61.                 // help resources
  62.                 // pick level resources
  63.                 // game resources
  64.         }
  65.         public void loadScenes() {
  66.                 // menu scene
  67.                 // help scene
  68.                 // pick level scene
  69.                 // game scene
  70.         }
  71. }

ViDu:

The problem is most likely that you are running the splash screen (some sort of Dialog such asProgressDialog I assume) in the same thread as all the work being done. This will keep the view of the splash screen from being updated, which can keep it from even getting displayed to the screen. You need to display the splash screen, kick off an instance of AsyncTask to go download all your data, then hide the splash screen once the task is complete.
So your Activity's onCreate() method would simply create a ProgressDialog and show it. Then create the AsyncTask and start it. I would make the AsyncTask an inner class of your main Activity, so it can store the data it has downloaded to some variable in your Activity and close the ProgressDialog in its onPostExecute() method.
Not sure how to elaborate anymore without just showing the code, so here it is:

public class MyActivity extends Activity {
    private ProgressDialog pd = null;
    private Object data = null;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // Show the ProgressDialog on this thread
        this.pd = ProgressDialog.show(this, "Working..", "Downloading Data...", true, false);

        // Start a new thread that will download all the data
        new DownloadTask().execute("Any parameters my download task needs here");
    }

    private class DownloadTask extends AsyncTask<String, Void, Object> {
         protected Object doInBackground(String... args) {
             Log.i("MyApp", "Background thread starting");

             // This is where you would do all the work of downloading your data

             return "replace this with your data object";
         }

         protected void onPostExecute(Object result) {
             // Pass the result data back to the main activity
             MyActivity.this.data = result;

             if (MyActivity.this.pd != null) {
                 MyActivity.this.pd.dismiss();
             }
         }
    }    
}

Obviously there are some pieces you need to fill in there, but this code should run and give you a good starting point (forgive me if there is a code error, I don't have access to the Android SDK as I'm typing this currently).
Some more good reading on the subject of AsyncTasks in Android can be found here and here.


Hoac:

public class SplashScreen extends Activity{
   @Override
   public void onCreate(Bundle savedInstanceState){
      super.onCreate(savedInstanceState);
      // set the content view for your splash screen you defined in an xml file
      setContentView(R.layout.splashscreen);

      // perform other stuff you need to do

      // execute your xml news feed loader
      new AsyncLoadXMLFeed().execute();

   }

   private class AsyncLoadXMLFeed extends AsyncTask<Void, Void, Void>{
      @Override
      protected void onPreExecute(){
            // show your progress dialog

      }

      @Override
      protected Void doInBackground(Void... voids){
            // load your xml feed asynchronously
      }

      @Override
      protected void onPostExecute(Void params){
            // dismiss your dialog
            // launch your News activity
            Intent intent = new Intent(SplashScreen.this, News.class);
            startActivity(intent);

            // close this activity
            finish();
      }

   }
}