【问题标题】:Sometimes fragment lose activity有时片段失去活动
【发布时间】:2015-01-01 17:04:24
【问题描述】:

我不明白出了什么问题,在我的设备应用程序运行良好,但有时在日志中(应用程序用户、会话、崩溃......通过某些服务跟踪)我看到应用程序崩溃(NullPointerException),Toast 不能因为活动变量为空而被运行。

第 45 行(populateCats() 方法抛出异常 NullPointerException)

    package package.name;

import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.ListFragment;
import android.view.View;
import android.widget.ListView;
import android.widget.Toast;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

import java.util.ArrayList;


public class CatsList extends ListFragment implements OnTaskCompleted {
    Document doc;
    MainActivity activity;
    ArrayList<Cat> cats;

    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);
        Cat cat = cats.get(position);

        //SOME CODE
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        new GetData(activity, this, false).execute(Jsoup.connect(MainActivity.url));
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        this.activity = (MainActivity) activity;
    }

    public void populateCats(){
        if(doc == null)
        {

            Toast.makeText(activity, "Error....", Toast.LENGTH_SHORT).show();
            return;
        }
        Toast.makeText(activity, "Success....", Toast.LENGTH_SHORT).show();

        //SOME CODE
    }


}

日志:

java.lang.NullPointerException
at android.widget.Toast.<init>(Toast.java:98)
at android.widget.Toast.makeText(Toast.java:254)
at PACKAGE_NAME.CatsList.populateCats(CatsList.java:64)
at PACKAGE_NAME.CatsList.taskCompleted(CatsList.java:92)
at PACKAGE_NAME.GetData.onPostExecute(GetData.java:61)
at PACKAGE_NAME.GetData.onPostExecute(GetData.java:12)
at android.os.AsyncTask.finish(AsyncTask.java:631)
at android.os.AsyncTask.access$600(AsyncTask.java:177)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4921)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)
at dalvik.system.NativeStart.main(Native Method)

AndroidManifect.xml 还包含 - android:configChanges="keyboardHidden|orientation|screenSize"

【问题讨论】:

  • 尝试将 toasts 中的活动变量更改为 getActivity()。您的活动变量设置不正确......是否可以使用您从 onAttach(活动活动)获得的活动参考?像这样:this.activity = 上述方法的活动?
  • 为什么? onAttach 方法在 populateCats() 之前调用,我将保存对活动的引用.. p.s.我也试过这个方法
  • 试试:this.activity = getActivity() in onActivityCreated(Bundle)。见developer.android.com/reference/android/app/…
  • @ramaral 我能知道为什么吗? ))
  • @ramaral 我无法尝试,因为在我的手机应用程序上运行良好(我在跟踪我的应用程序的服务日志中发现异常)我希望你能理解我的英语)

标签: android android-fragments


【解决方案1】:

如果我假设正确的话,populateCats() 方法是由 GetData 类异步调用的。这意味着当用户关闭活动时,异步过程仍在运行中有几个交错。这将导致 NPE,因为如果您正确实现了 onAttach/onDetach,则在 Activity 关闭后分离 Fragment 时,您正在清除 Activity 引用。

作为一种良好做法,您应该始终检查每个 Activity 引用或 getActivity() 调用的状态,并在执行任何其他指令之前验证它们不为空。

【讨论】:

  • 是的,你是对的,GetData 调用了另一个调用 populateCats() 的方法;谢谢))我认为你对我的问题是正确的)
猜你喜欢
  • 2021-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-02
相关资源
最近更新 更多