Android AsyncTask内部的Toast片段内部导致崩溃
当这两个烤面包在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
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)
之前运行,(myProgressgetActivity()
将返回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
。好了。