sử dụng startActivityForResult từ không hoạt động


82

Tôi có MainActivity là một Activity và lớp khác (là một lớp java đơn giản), chúng tôi sẽ gọi nó là "SimpleClass". bây giờ tôi muốn chạy từ lớp đó lệnh startActivityForResult.

bây giờ tôi mặc dù tôi có thể truyền lớp đó (SimpleClass), chỉ có ngữ cảnh của MainActivity, vấn đề là, bạn không thể chạy context.startActivityForResult (...);

vì vậy cách duy nhất tạo SimpleClass để sử dụng 'startActivityForResult; là chuyển tham chiếu của MainActivity dưới dạng một biến Activity cho SimpleClass một cái gì đó tương tự như vậy:

bên trong lớp MainActivity, tôi tạo phiên bản của SimpleClass theo cách này:

SimpleClass simpleClass=new SimpleClass(MainActivity.this);

bây giờ đây là cách SimpleClass trông như thế này:

public Class SimpleClass {

Activity myMainActivity;

   public SimpleClass(Activity mainActivity) {
       super();
       this.myMainActivity=mainActivity;    
   }
....


    public void someMethod(...) {
        myMainActivity.startActivityForResult(...);
    }

}

bây giờ nó đang hoạt động, nhưng không phải là một cách thích hợp để làm điều này? Tôi sợ rằng mình có thể bị rò rỉ bộ nhớ trong tương lai.

cảm ơn. cá đuối.


Tôi không biết bạn đang cố gắng làm gì nhưng bạn nên đọc cái này .
Macarse

1
Bằng cách này, bạn có thể sử dụng onActivityResultphương thức bên trong simpleClass của mình hay bạn không có ý định? Cùng một vấn đề ở đây ..
Vivere_FlowCoder

Câu trả lời:


64

Tôi không biết liệu đây có phải là phương pháp tốt hay không, nhưng casting a Context object to an Activity objectbiên dịch tốt.

Thử cái này:

if (mContext instanceof Activity) {
        ((Activity) mContext).startActivityForResult(...);
} else {
        Log.e("mContext should be an instanceof Activity.");
} 

Điều này sẽ được biên dịch và kết quả phải được chuyển đến hoạt động thực tế có bối cảnh.


Làm thế nào về nếu ngữ cảnh được chuyển từ một dịch vụ?
Madhur Ahuja

9
Không, nó thực hiện một ngoại lệ diễn viên!
Lisa Anne

1
Một bối cảnh không phải là không thể tránh khỏi một hoạt động (ví dụ nếu nó nhận được vớimyActivity.getApplicationContext()
Hugo Gresse

Nếu mục đích là tránh rò rỉ bộ nhớ, thì việc giữ ngữ cảnh như một biến thành viên của lớp có lợi gì hơn việc giữ một hoạt động? Việc lưu trữ một ngữ cảnh không có khả năng dẫn đến rò rỉ bộ nhớ giống như lưu trữ một hoạt động?
stevehs17

4

Nếu bạn cần lấy kết quả từ Activity trước đó, thì lớp gọi của bạn phải thuộc loại Activity.

Mục đích bạn gọi là Activity.startActivityForResult()gì nếu bạn không bao giờ sử dụng kết quả (ít nhất là theo mã mẫu bạn đã đăng).

myMainActivitylàm gì với kết quả không? Nếu vậy, chỉ cần tạo SimpleClassmột lớp con của Activity và xử lý kết quả từ bên trong SimpleClassnó.
Nếu myMainActivitycần kết quả, thì có thể bạn nên cấu trúc lại mã để bắt đầu hoạt động myMainActivity.


2
Tôi đang sử dụng kết quả, chỉ là tôi muốn tách nó thành lớp khác, vì vậy tôi đã tự hỏi làm thế nào tôi nên chuyển một tham số Hoạt động cho một lớp không hoạt động, mà không gây rò rỉ trong tương lai.
rayman

1
Còn việc biến SimpleClass thành một lớp lồng nhau thì sao?
mã hóa

0

Giải pháp tốt hơn là:

  1. Làm SimpleClassmột lớp con của bạn Activitylớp
  2. gọi Hoạt động khác là startActivityForResult
  3. xử lý kết quả trong SimpleClasschính nó

3
nghe có vẻ như điều này nên hoạt động, nhưng tôi đã hiểu điều này:java.lang.NullPointerException: Attempt to invoke virtual method 'android.app.ActivityThread$ApplicationThread android.app.ActivityThread.getApplicationThread()' on a null object reference
Boy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.