2013-02-05 29 views
10

Chỉ muốn chặn hướng cho đến khi tất cả dữ liệu được tải trong chế độ xem của tôi. Vì vậy, tôi nghĩ về đoạn mã sau nhưng nó không hoạt động.Định hướng khóa cho đến khi kết thúc Asynctask

private class task extends AsyncTask<String, Void, String> { 

    protected String doInBackground(String... params) { 
     ... 
    } 

    protected void onPostExecute(String result) { 
     ... 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR); 
    } 

    protected void onPreExecute() { 
     ... 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR); 
    } 
} 

Khi tôi chạy hai dòng SENSORNOSENSOR màn hình của tôi quay ngang tự động, mà không hiểu tại sao. Điều đó có thể xảy ra?

EDIT: tôi đặt những dòng sau để kiểm tra định hướng hiện tại với kết quả sau:

protected void onPreExecute() { 
     if (getResources().getConfiguration().orientation==Configuration.ORIENTATION_LANDSCAPE) { 
      Log.e("TAG","LANDSCAPE"); 
     }else{ 
      Log.e("TAG","PORTRAIT"); 
     } 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR); 
    } 

Kết quả Logcat:

LANDSCAPE 

Nhưng nếu tôi loại bỏ hai dòng (SetRequestedOrientation) để tôi nhận được điều này trong logcat:

PORTRAIT 
+0

Kiểm tra http://stackoverflow.com/questions/3821423/background-task-progress-dialog-orientation-change-is-there-any-100-working/3821998#3821998 – Slartibartfast

Trả lời

6

Chỉ cần thay thế setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR); với setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);

Và cho tôi biết những gì xảy ra ..

Đối với Sinh viên mới ra

protected void onPreExecute() { 
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR); 
} 

Tại Thoát Cấp

protected void onPostExecute(String result) { 
     ... 
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); 
    } 

Cập nhật:

hành vi có dây (Trong trường hợp của bạn) nhưng, bất kỳ cách nào bạn có thể nhận định hướng hiện tại sử dụng,

int currentOrientation = getResources().getConfiguration().orientation; 

Bây giờ thiết lập định hướng này trong onPreExecute() ..

Giống như,

protected void onPreExecute() { 
    ... 
    int currentOrientation = getResources().getConfiguration().orientation; 
    if (currentOrientation == Configuration.ORIENTATION_LANDSCAPE) { 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE); 
    } 
    else { 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT); 
    } 
} 

Đơn giản .. :-)

+0

cảm ơn bạn đã trả lời. Cùng một vấn đề, thay đổi để cảnh quan: S – jlopez

+0

Trên thực tế, nó cho cùng một định hướng cấu hình (bị khóa) cho thời gian làm việc của bạn. – user370305

+0

tôi chỉnh sửa câu trả lời của tôi, bạn có thể thấy không? – jlopez

0

Có thể là lỗi, nhưng có thể cách tốt hơn là để eit khóa của bạn định hướng của bạn, do đó bạn không cần phải lo lắng về các hoạt động được tạo ra ... HOẶC tốt hơn được nêu ra.

Sử dụng này trong biểu hiện của bạn cho hoạt động này:

android:configChanges="orientation|screenSize|screenLayout" 

Sau đó, hoạt động của bạn không được tái tạo trên xoay (cũng như của Honeycomb/3.0 Các hoạt động không được tái tạo trên xoay).

Chỉ cần ghi đè lên:

onConfigurationChanged(Configuration newConfig){ 
    //Handle new orientation 
} 

Sau đó, bạn không cần phải gây nhầm lẫn cho người sử dụng tại sao lại có điện thoại đã ngưng xoay trong phẫu thuật.


Cũng đáng xem Robospice nếu bạn muốn nhiệm vụ không đồng bộ suốt đời.

+0

property screenSize là dành cho Android 4.0.3. và tôi đang sử dụng Android 2.3.3 – jlopez

+1

Nó không quan trọng, Nó luôn luôn được khuyên nên xây dựng/nhắm mục tiêu API mới nhất (17 tại thời điểm viết) sau đó thiết lập tối thiểu của bạn (để một cái gì đó như API8), điều này đảm bảo rằng ứng dụng của bạn không chạy ở chế độ tương thích trên các thiết bị mới hơn. Và có nghĩa là bạn bao gồm các cờ làm cờ phía trên 50% số người dùng khác của bạn. –

0

Bạn đang làm điều này bởi vì bạn đã thấy rằng tác vụ không đồng bộ của bạn bị giết trong quá trình hủy và tái tạo hoạt động. Tôi có đúng không?

Cách xử lý đúng cách này là không phải để khóa hướng trong khi tác vụ của bạn đang chạy. Tôi không đồng ý rằng cách tiếp cận setRequestedOrientation không hoạt động là một lỗi; thay vì ý tưởng khóa một định hướng hoạt động và sau đó mở khóa từ một tác vụ không đồng bộ thì không được hỗ trợ.

Tôi đã giải thích in some detail cách đảm bảo tác vụ không đồng bộ của bạn không bị giết bằng cách hủy liên kết nó với vòng đời hoạt động của bạn. Nhìn lại giải pháp tôi đã cung cấp kể từ khi tôi khám phá ra cách tốt hơn để kiểm tra dịch vụ đang chạy (Kiểm soát tiến trình giữa và bị ràng buộc dịch vụ) nhưng áp dụng nguyên tắc bao quát. Lưu trữ tác vụ không đồng bộ theo định hướng không biết android.app.Service và cho phép tác vụ không đồng bộ chỉ liên lạc với dịch vụ và dịch vụ để chỉ giao tiếp với những hoạt động có liên kết với nó.

Tôi nghĩ đây là cách tiếp cận tiêu chuẩn hơn.

+0

Lời giải thích của ông có vẻ rất hợp lý không, nhưng tôi có thể đưa nó vào thực tế không? Tôi không hiểu rõ cách thực hiện điều này – jlopez

+0

Đọc phần hướng dẫn dành cho nhà phát triển trên [_bound_ services] (http://developer.android.com/guide/components/bound-services.html) và sau đó xem làm cho dịch vụ của bạn trở thành [[Intent service] (http://developer.android.com/reference/android/app/IntentService.html) - loại dịch vụ đặc biệt này tự chết sau khi nhiệm vụ async cơ bản đã hoàn thành. Điều này loại bỏ một số lượng hợp lý của mã tấm nồi hơi-muốn tôi đã phát hiện ra nó trước đó. – OceanLife

+0

Tôi ước tôi có thể thực hiện giải pháp của bạn, nhưng nó có vẻ phức tạp và tôi không có nhiều thời gian. – jlopez

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