Android 有时碎片会失去活性

Android 有时碎片会失去活性,android,android-fragments,Android,Android Fragments,我无法理解出了什么问题,在我的设备应用程序运行良好,但有时在日志(应用程序用户、会话、崩溃…通过某些服务跟踪)中,我看到应用程序崩溃(NullPointerException),Toast无法运行,因为活动变量为null 第45行(populateCats()方法引发异常NullPointerException) package.name; 导入android.app.Activity; 导入android.os.Bundle; 导入android.support.v4.app.ListFrag

我无法理解出了什么问题,在我的设备应用程序运行良好,但有时在日志(应用程序用户、会话、崩溃…通过某些服务跟踪)中,我看到应用程序崩溃(NullPointerException),Toast无法运行,因为活动变量为null

第45行(populateCats()方法引发异常NullPointerException

package.name;
导入android.app.Activity;
导入android.os.Bundle;
导入android.support.v4.app.ListFragment;
导入android.view.view;
导入android.widget.ListView;
导入android.widget.Toast;
导入org.jsoup.jsoup;
导入org.jsoup.nodes.Document;
导入java.util.ArrayList;
公共类CatsList扩展ListFragment实现OnTaskCompleted{
文件文件;
主要活动;
ArrayList猫;
@凌驾
public void onListItemClick(列表视图l、视图v、整数位置、长id){
super.onListItemClick(左、右、位置、id);
Cat=cats.get(位置);
//一些代码
}
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
新建GetData(activity,this,false).execute(Jsoup.connect(MainActivity.url));
}
@凌驾
公共事务主任(活动){
超级转速计(活动);
this.activity=(MainActivity)活动;
}
公共空间{
如果(doc==null)
{
Toast.makeText(活动,“错误…”,Toast.LENGTH_SHORT.show();
返回;
}
Toast.makeText(活动,“成功…”,Toast.LENGTH_SHORT.show();
//一些代码
}
}
日志:

java.lang.NullPointerException
在android.widget.Toast.(Toast.java:98)
位于android.widget.Toast.makeText(Toast.java:254)
位于PACKAGE_NAME.CatsList.populateCats(CatsList.java:64)
在包_NAME.CatsList.taskCompleted处(CatsList.java:92)
在包_NAME.GetData.onPostExecute处(GetData.java:61)
在包_NAME.GetData.onPostExecute(GetData.java:12)处
位于android.os.AsyncTask.finish(AsyncTask.java:631)
在android.os.AsyncTask.access$600(AsyncTask.java:177)
位于android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
位于android.os.Handler.dispatchMessage(Handler.java:99)
位于android.os.Looper.loop(Looper.java:137)
位于android.app.ActivityThread.main(ActivityThread.java:4921)
位于java.lang.reflect.Method.Invokenactive(本机方法)
位于java.lang.reflect.Method.invoke(Method.java:511)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run上(ZygoteInit.java:1027)
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)
在dalvik.system.NativeStart.main(本机方法)

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

如果假设正确,则方法populateCats()GetData类异步调用。这意味着当用户关闭活动时,异步过程仍在运行的地方存在多个交错。这将导致NPE,因为如果您正确实现了onAttach/onDetach,那么在活动关闭后分离片段时,您正在清除活动引用


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

尝试在Toast中将活动变量更改为getActivity()。您的activityvariable设置不正确。。。是否可以使用从onAttach(活动)获得的活动性参考?像这样:this.activity=上述方法上的活动?为什么?在populateCats()之前调用onAttach方法,在那里我将保存对活动的引用。。p、 我在onActivityCreated(Bundle)中也尝试了这个方法:this.activity=getActivity()。见@ramaral我能知道原因吗?)@ramaral我不能尝试它,因为在我的手机应用程序上工作得很好(我在跟踪我的应用程序的服务日志中发现了一个例外),我希望你能理解我的英语)是的,你是对的,GetData调用另一个调用populateCats()的方法;(谢谢)我想你对我的问题是对的
    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)