2017-04-19 35 views
-3

我有應用程序,它具有片段和對收到的一些錯誤我要到前面的片段,所以我用getActivity流汗空在一些設備中

getActivity()onBackPressed()。

其工作正常,但在某些設備中,我收到錯誤。

Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v4.app.FragmentActivity.onBackPressed()' on a null object reference 
    at com.nusatrip.fragment.PaymentProcessFragment.receivedError(PaymentProcessFragment.java:633) 
    at com.nusatrip.fragment.PaymentProcessFragment.access$500(PaymentProcessFragment.java:113) 
    at com.nusatrip.fragment.PaymentProcessFragment$1.onResponseReceived(PaymentProcessFlightFragment.java:597) 
    at com.nusatrip.services.FlightTransactionSubmit.onPostExecute(TransactionSubmit.java:35) 
    at android.os.AsyncTask.finish(AsyncTask.java:651) 
    at android.os.AsyncTask.access$500(AsyncTask.java:180) 
    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:668) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:148) 
    at android.app.ActivityThread.main(ActivityThread.java:7325) 
    at java.lang.reflect.Method.invoke(Method.java) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 

我在我的其他設備上試過了,它工作正常。這個錯誤是在crashlytics fabric.io中產生的。 我不知道爲什麼這個空指針的錯誤即將到來。謝謝

+0

'getActivity()'可能在某些情況下,返回'null'(閱讀文檔時),並在你的情況下,它會返回'null' ......它與片段的和活動的整個生命週期連接 – Selvin

+0

@ Selvin-像什麼案例。因爲大部分設備都沒有面臨這個問題。 – Mehdi

+0

很明顯,當AsyncTask完成之前分離片段時 – Selvin

回答

0

問題在於你在訪問Asynchronous類中的活動,當你得到你的迴應時,你的Activity可能已經被破壞了。

一種可能的解決方案是根據我通常遵循是使用一個全局上下文對象

另一種解決方案以檢查空活動和執行操作。

private Context mContext; 

@Override 
public void onAttach(Context mContext) { 
    super.onAttach(mContext); 
    this.mContext = mContext; 
} 

//then use this context instead of getActivity() wherever required. 
//It makes sure that you have active context object even if object is destroyed. 

一般來說,這個必須避免,因爲它可能會導致內存泄漏。理想情況下,你必須首選檢查空指針的第一步。

如果您想遵循第2步(最可靠),請確保正確處理上下文。

編輯

基於你對收到的一些錯誤我要到前面的片段點所以我用

這裏是你可以跟着另一件事,

創建界面處理片段與你的類別的相互作用

FragmentChanger.java

public interface FragmentChanger{ 
    void removeCurrentFragment(); 
} 

然後按照上面的步驟有以下變化

private FragmentChanger mFragmentChanger; 

@Override 
public void onAttach(Context mContext) { 
    super.onAttach(mContext); 
    this.mFragmentChanger = (FragmentChanger) mContext; 
} 

//and then in your onError method 
mFragmentChanger.removeCurrentFragment(); 

,然後實現在您的活動這個接口,並採用分段管理執行更改。

public class MyActivity extends AppCompatActivity implements FragmentChanger{ 
    //other codes 
    @Override 
    public void removeCurrentFragment(){ 
     getFragmentManager().popBackStackImmediate(); 
     //using onBackpressed is generally not a good idea to go back to previous fragment. 
    } 
} 
+0

顯然秒不是一個解決方案調用'onBackPressed' ...在分離出這樣的活動上下文之後,這個活動上下文將無效,因爲80%的活動也被破壞了......它也不是*「全局上下文對象」*它是某些類中的字段 - 非靜態私有字段不是全局的。無論如何,以這種方式存儲上下文是一個可怕的想法,因爲它會導致上下文泄漏 – Selvin

+0

是@Selvin我已經指定了有關全局上下文所涉及的內存泄漏問題,並且剛剛意識到可以爲他嘗試的任務提供更好的解決方案。相應地更新了答案。 –