Android AsyncTask内部的Toast片段内部导致崩溃

Android AsyncTask内部的Toast片段内部导致崩溃,android,android-asynctask,fragment,Android,Android Asynctask,Fragment,当这两个烤面包在AsyncTask的内部时,它会导致崩溃,当我移除这两个烤面包时,一切正常,没有崩溃。为什么会这样?如何在异步任务中使用toast消息而不导致崩溃 Toast.makeText(activity, "onPostExecute", Toast.LENGTH_LONG).show(); Toast.makeText(activity,"onPreExecute", Toast.LENGTH_LONG).show(); Logcat显示toast消息的nullPointerEx

当这两个烤面包在AsyncTask的内部时,它会导致崩溃,当我移除这两个烤面包时,一切正常,没有崩溃。为什么会这样?如何在异步任务中使用toast消息而不导致崩溃

 Toast.makeText(activity, "onPostExecute", Toast.LENGTH_LONG).show();
 Toast.makeText(activity,"onPreExecute", Toast.LENGTH_LONG).show();
Logcat显示toast消息的nullPointerException。当我移除两个烤面包中的第一个时,它会运行,然后崩溃,当第一个烤面包在那里时,它会在启动时崩溃,当两个烤面包都被移除时,它不会崩溃

代码的其余部分

 public class FragmentStaticFragment extends Fragment {

private Button buttonStartProgress;
private ProgressBar progressBar;
Activity activity = getActivity();

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_static_fragment, container, false);

    buttonStartProgress = (Button) view.findViewById(R.id.button1);
     progressBar = (ProgressBar) view.findViewById(R.id.progressBar1);


    buttonStartProgress.setOnClickListener(new Button.OnClickListener(){

           @Override
           public void onClick(View v) {
            // TODO Auto-generated method stub
            new BackgroundAsyncTask().execute();
            buttonStartProgress.setClickable(false);
           }

        });


    return view;
}

 public class BackgroundAsyncTask extends AsyncTask<Void, Integer, Void>{

    int myProgress;

     @Override
      protected void onPostExecute(Void result) {
       // TODO Auto-generated method stub
               // commented out this toast to avoid crashing
      // Toast.makeText(activity, "onPostExecute", Toast.LENGTH_LONG).show();
       buttonStartProgress.setClickable(true);
      }

      @Override
      protected void onPreExecute() {
       // TODO Auto-generated method stub
              // commented out this toast to avoid crashing
     //  Toast.makeText(activity,"onPreExecute", Toast.LENGTH_LONG).show();
       myProgress = 0;
      }

      @Override
      protected Void doInBackground(Void... params) {
       // TODO Auto-generated method stub
       while(myProgress<100){
        myProgress++;
        publishProgress(myProgress);
           SystemClock.sleep(100);
       }
       return null;
      }

      @Override
      protected void onProgressUpdate(Integer... values) {
       // TODO Auto-generated method stub
       progressBar.setProgress(values[0]);
      }


} // end BackgroundAsyncTask

 }
公共类FragmentStaticFragment扩展了Fragment{
私有按钮启动进度;
私人ProgressBar ProgressBar;
Activity=getActivity();
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
视图=充气机。充气(R.layout.fragment\u static\u fragment,container,false);
buttonStartProgress=(Button)view.findViewById(R.id.button1);
progressBar=(progressBar)view.findViewById(R.id.progressBar1);
buttonStartProgress.setOnClickListener(新建Button.OnClickListener()){
@凌驾
公共void onClick(视图v){
//TODO自动生成的方法存根
新建BackgroundAsyncTask().execute();
按钮启动进度。可设置可点击(错误);
}
});
返回视图;
}
公共类BackgroundAsyncTask扩展了AsyncTask{
int-myProgress;
@凌驾
受保护的void onPostExecute(void结果){
//TODO自动生成的方法存根
//为了避免撞车,我把这片面包评论掉了
//Toast.makeText(活动“onPostExecute”,Toast.LENGTH_LONG.show();
按钮启动进度。可设置可点击(true);
}
@凌驾
受保护的void onPreExecute(){
//TODO自动生成的方法存根
//为了避免撞车,我把这片面包评论掉了
//Toast.makeText(活动“onPreExecute”,Toast.LENGTH_LONG.show();
myProgress=0;
}
@凌驾
受保护的Void doInBackground(Void…参数){
//TODO自动生成的方法存根
而如果在
onAttach(Activity)
之前运行,(myProgress
getActivity()
将返回
null
。相反,您应该在
onPreExecute
onPostExecute
方法中直接调用
getActivity()
,或者在
onAttach
中获取对它的引用:

public void onAttach (Activity attachedActivity) {
    activity = attachedActivity;
}
如果在
onAttach(Activity)
之前运行
getActivity()
将返回
null
。相反,您应该直接在
onpreecute
onPostExecute
方法中调用
getActivity()
,或者在
onAttach
中获取对它的引用:

public void onAttach (Activity attachedActivity) {
    activity = attachedActivity;
}

发布logcat跟踪。发布logcat跟踪。现在可以了,您的答案是正确的,但是您在下面给出的使用onAttach的答案示例不起作用。并继续崩溃。但是我按照您在答案中所说的做了,我在onPreExecute方法中调用getActivity,并将其放入作为AsyncTask cl成员的activity变量中ass.现在一切都很好地工作了,但没有工作,因为在创建toast的时候,Tach甚至还没有被调用,你应该阅读Fragment的生命周期,这将有助于你解决更多问题…进一步推动@ianhanniballake的响应。创建一个全局变量
private Activity mActivity;
然后在
onPreExecute
在AsyncTask中,定义变量,
MacActivity=getActivity();
(对于片段类型)。
MacActivity=this;
对于活动。然后在调用toast时,替换
getActivity()
使用
mActivity
。现在可以了。现在可以了,您的答案是正确的,但是您在下面给出的使用onAttach的答案的示例不起作用。并且继续崩溃。但是我按照您在答案中所说的做了,我在onPreExecute方法中调用了getActivity,并将其放入作为Async成员的activity变量中任务类。现在一切都很好地工作了。没有工作,因为在创建toast时,Tach甚至还没有被调用,您应该阅读Fragment的生命周期,这将有助于解决更多问题…进一步推动@ianhanniballake的响应。创建一个全局变量
private Activity mActivity;
然后在在AsyncTask中的
onPreExecute
中,定义变量
mActivity=getActivity();
(对于片段类型)。
mActivity=this;
用于活动。然后,当您调用toast时,将
getActivity()
替换为
mActivity
。好了。