2011-10-29 29 views
5

Tôi đang cố cập nhật giao diện người dùng của mình theo số FirstActivity khi tôi nhận được thông báo nhưng bị nhầm lẫn bởi runOnUiThread, RunnableHandler. Đây là những gì tôi có: Tôi đang chạy FirstActivity và NotificationService. Khi NotificationService báo lại một thông báo, nó sẽ cập nhật UI đầu tiên.Cập nhật giao diện người dùng từ một dịch vụ (sử dụng trình xử lý?)

Tôi cũng có một dịch vụ khác AlarmService đang chạy. Hoạt động đầu tiên

@Override 
public void onResume() { 
     super.onResume(); 
     //some other code for alarm service 
} 

NotificationService

//on receiving notification 
    private void showNotification(String text) { 

    //Get activity 
    Class<?> activityClass = null; 
    try { 
     activityClass = Class.forName("com.pakage.FirstActivity"); 
     contextActivity = (Activity) activityClass.newInstance(); 

     //Update UI on FirstActivity not working 
     contextActivity.runOnUiThread(new Runnable() { 
      public void run() 
      { 
       Looper.prepare(); 
       TextView tv = (TextView) contextActivity.findViewById(R.id.notifyTest); 
       Looper.loop(); 

      } 
      }); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

      //Shows the notification 
      Notification n = new Notification();  
      //... etc 
} 

tôi tiếp tục nhận được lỗi looper.prepare. Tôi có cần phải đặt thêm mã trong FirstActivity của tôi không?

+0

bạn có thể hiển thị cho chúng tôi thư trong nhật ký của bạn từ logcat không? Ngoài ra, làm thế nào bạn tuyên bố Looper? –

+1

Tôi nhận được 'Không thể tạo trình xử lý bên trong luồng mà không được gọi là lỗi Looper.prepare()'. Looper được khai báo trong phương thức 'showNotification' ở trên – newbie

Trả lời

5

Bản năng thứ nhất của tôi là bạn nên thay đổi Hoạt động liên kết với dịch vụ của bạn và xử lý cập nhật giao diện người dùng ở bên cạnh dịch vụ thay vì Dịch vụ trực tiếp sửa đổi Hoạt động.

Xem thêm thông tin ở đây:
http://developer.android.com/reference/android/app/Service.html#LocalServiceSample

Và một ví dụ ở đây:
Example: Communication between Activity and Service using Messaging

+1

nhận được câu trả lời của tôi từ một trong những câu trả lời ở đó. cảm ơn! – newbie

0

Tôi không có ý tưởng tại sao bạn đang đặt một Looper trong

contextActivity.runOnUiThread(new Runnable() { 
    public void run() 
    { 
     Looper.prepare(); 
     TextView tv = (TextView) contextActivity.findViewById(R.id.notifyTest); 
     Looper.loop(); 

    } 
}); 

vì giao diện người dùng (chính) đã có Looper/Handler, v.v.

Ngay cả khi nó đã làm việc Looper.loop() sẽ chặn và vì bạn đang chạy nó trên chuỗi giao diện người dùng, nó sẽ chặn chuỗi giao diện người dùng không phải là thứ bạn muốn.

gì bạn thực sự muốn làm là

contextActivity.runOnUiThread(new Runnable() { 
    public void run() 
    { 
     TextView tv = (TextView) contextActivity.findViewById(R.id.notifyTest); 
     tv.setText("do something that must be on UI thread") // or whatever 
    } 
}); 

Bạn không thực sự cần phải làm tất cả những công cụ ưa thích này để có được những Hoạt động

activityClass = Class.forName("com.pakage.FirstActivity"); 
contextActivity = (Activity) activityClass.newInstance(); 

giả định các dịch vụ và hoạt động đều chạy trong quá trình tương tự bạn chỉ có thể lưu tham chiếu đến Hoạt động nhưng hãy cẩn thận cập nhật tham chiếu khi Hoạt động bị hủy.

+0

Cả dịch vụ và hoạt động đều đang chạy trong cùng một quy trình. Bạn có ý gì bằng cách lưu tham chiếu đến hoạt động? Tôi đã thử sử dụng 'FirstActivity.runOnUiThread'. – newbie

+0

cũng đã cập nhật câu hỏi của tôi – newbie

5

Tôi đã luôn luôn có dịch vụ kích hoạt một Broadcast và sau đó trong Activity của tôi, tôi có một BroadcastReciever nghe cho Broadcast. Đó là một cách tiếp cận đơn giản hơn nhiều so với cách bạn đã phác thảo ở trên.

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