2012-10-23 36 views
7

Có thể tải hoạt động mới trong nền trước khi chuyển chế độ xem sang hoạt động đó không?Tải hoạt động trong nền trước khi hiển thị nó

Ví dụ, tôi muốn có một hoạt động màn hình cắt giảm được gọi và hiển thị màn hình giật gân. Trong khi màn hình giật gân này được hiển thị, hoạt động tiếp theo sẽ được tải, và khi nó được thực hiện tải (khi nó onCreate() kết thúc) thì hoạt động màn hình giật gân kết thúc và hoạt động mới được hiển thị.

Tôi biết một tùy chọn khác là hiển thị màn hình giật trong hoạt động mới và sử dụng tác vụ async để tải tất cả dữ liệu trước khi xóa hình ảnh giật gân ... nhưng tôi cũng bị kẹt trên phương pháp đó. Hoạt động đầu tiên phải tải một lượng dữ liệu hợp lý và sau đó nó phải tự động thêm các phần tử GUI dựa trên dữ liệu đó. Khi GUI được nạp đầy, sau đó tôi muốn loại bỏ màn hình giật gân. Vấn đề là tôi không thể chạm vào chuỗi giao diện người dùng từ doInBackground(). Làm cách nào để tạo hoạt động của tôi sau màn hình giật gân, nếu tôi không thể cập nhật giao diện người dùng từ doInBackground? Tôi biết rằng onProgressUpdate() có thể truy cập vào chuỗi giao diện người dùng, nhưng tôi không thể tìm ra cách thực hiện nó.

Bất kỳ ý tưởng nào? Cảm ơn bạn!

Trả lời

5

Vì bạn không có ví dụ về mã của mình, tôi không chắc chắn loại dữ liệu bạn đang tải và cách bạn định cấu hình động giao diện người dùng dựa trên dữ liệu, nhưng tôi sẽ cố gắng trả lời nhiều nhất Tôi có thể. Kết quả là, câu trả lời có thể âm thanh một chút chung chung.

Đầu tiên, xác định 2 tệp xml bố cục - một cho màn hình giật gân và một cho hoạt động "chính" của bạn. Vì vậy, bạn sẽ kết thúc với /res/layout/splash_screen.xml và /res/layout/main.xml

Trong onCreate() của bạn, tải bố trí splash_screen:

setContentView(R.layout.splash_screen); 

Trong async của bạn nhiệm vụ, bạn sẽ tải lên bất kỳ dữ liệu nào bạn cần làm và bạn sẽ lưu tất cả dữ liệu đó trong một số loại cấu trúc dữ liệu. Tôi sẽ sử dụng một LinkedList String cho ví dụ.

private class MyTask extends AsyncTask<Uri, Integer, List<String>> { 

    @Override 
    protected List<String> doInBackground(Uri... params) { 
     List<String> myList = new LinkedList<String>(); 
     // load up the list with data you are trying to get 
     myList.add("foo"); 
     myList.add("bar"); 
     // whatever you return here will be passed in as a parameter to the onPostExecute() 
     return myList; 
    } 

    @Override 
    protected void onPostExecute(List<String> result) { 
     setContentView(R.layout.main2); 
     // set layout elements with data that from the result 
     TextView myTextView = (TextView) findViewById(R.id.some_label); 
     myTextView.setText(result.get(0)); 
     // or just call some function you defined in your activity instead 
    } 
} 

Vì vậy, về cơ bản, có 2 file layout khác nhau và sử dụng cách bố trí splash_screen, và sử dụng các nhiệm vụ async tải dữ liệu và lưu nó trong một số cấu trúc dữ liệu bạn xác định và sử dụng cấu trúc dữ liệu để tải phần UI của bạn trong onPostExecute() sau khi sử dụng setContentView() để thay đổi trở lại bố cục chính của bạn.

Một lưu ý đặc biệt: Với đoạn mã trên, nó sẽ hiển thị lại màn hình giật gân và tải lại tất cả dữ liệu nếu bạn xoay màn hình. Nếu bạn muốn tránh điều đó, bạn có thể sử dụng onSaveInstanceState() và lưu bất kỳ dữ liệu nào bạn muốn trong outBundle và đọc dữ liệu đó trong gói SavedInstanceState onCreate và tải các phần tử giao diện người dùng sao lưu. Điều này sẽ yêu cầu một thread riêng biệt (hoặc bạn chỉ có thể tìm kiếm về nó) nếu bạn muốn biết thêm về xử lý luân chuyển.

+0

Tôi xin lỗi vì tôi không thể cung cấp bất kỳ mã nào vì tôi đã ký một NDA ngăn tôi chia sẻ mã. Mặc dù vậy, tôi có thể nói chung. Tôi về cơ bản tải lên một xml tùy thuộc vào một điều kiện, và rằng tập tin xml cho tôi biết những hình ảnh tôi cần để hiển thị, cũng như thông tin đó là gắn liền với hình ảnh đó. Tôi đi qua và tự động tạo chế độ xem hình ảnh từ danh sách hình ảnh được trả về và thêm chúng vào chế độ xem. Phải mất 2-3 giây trước khi mọi thứ bật lên trên màn hình (có rất nhiều hình ảnh), vì vậy tôi muốn hiển thị một giật gân cho đến khi mọi thứ được tải và sẵn sàng để tương tác với. – romamnmlst

+0

Trong trường hợp đó, tôi nghĩ bạn có thể phân tích cú pháp tệp XML trong hàm doInBackground() ở trên, tạo ImageView và đặt nguồn hình ảnh và trả về một danh sách ImageView từ hàm doInBackground(). Hàm onPostExecute() sẽ lấy danh sách ImageViews và thêm chúng vào phân cấp khung nhìn sau setContentView(). Bất cứ điều gì bạn làm trong onPostExecute() đều chạy trong chuỗi chính để bạn có thể sửa đổi các phần tử giao diện người dùng từ đây. – hiBrianLee

+0

Tuyệt vời, tôi sẽ cung cấp cho một shot và xem nó hoạt động như thế nào. Cảm ơn bạn! (Có thể mất một lúc, nhưng nếu nó hoạt động, tôi chắc chắn sẽ quay lại và đánh dấu câu trả lời của bạn là được chấp nhận) – romamnmlst

1

Một trong những giải pháp để giải quyết vấn đề của bạn mà tôi có thể nghĩ đến là sử dụng một hoạt động để hiển thị màn hình giật gân và nội dung của bạn. Vì bạn có thể gọi phương thức setContentView() bất kỳ lúc nào (không chỉ trong phương thức onCreate()) chỉ định nghĩa tất cả các khung nhìn mà bạn muốn trong các tệp XML riêng biệt và chuyển id có liên quan đến setContentView() khi đến lúc chuyển đổi.

Bạn cũng có thể sử dụng một bố cục với chế độ xem và màn hình giật gân và ẩn/bỏ ẩn các thuộc tính. Khi dữ liệu của bạn đang tải setVisibility đến màn hình splash của bạn hiển thị trong khi chế độ xem gốc của bạn vẫn không hiển thị. Khi kết thúc tải - làm theo cách ngược lại.

Các vấn đề liên quan