【发布时间】:2014-10-22 23:30:23
【问题描述】:
因此采用此处描述的设计模式,其中异步任务通过此处描述的 setRetainInstance 包裹在保留的片段周围
http://www.androiddesignpatterns.com/2013/04/retaining-objects-across-config-changes.html
我遇到了一个问题,即在工作片段可以附加到活动之前启动任务,同时调用 onPreExecute 时将 mCallBack 设为空,这会引发 nullPointerException/
这主要是因为异步任务是通过方法调用(创建内部异步任务实例的 start 方法)而不是在 onCreate 或 OnActivityCreated 中启动的,因为任务可以再次启动(在它的新实例)并且不能在创建的 onCreate 或 OnActivity 中这样做,因为据我所知,这些方法的生命周期仅调用 1 次,因为 setRetainInstance 。
我的问题是在哪里编写某种例程的方法,从而等待片段附加到活动例程,如果是这样,您需要执行的任务是什么?
非常感谢。
更新 1:已发布代码
这是添加工作片段的方式。当用户按下发送反馈按钮时。调用此 OnClick 侦听器。您看到的最后一个 if 语句是启动异步任务的原因。请注意,此代码在另一个片段中。
@Override
public void onClick(View v)
{
// TODO Auto-generated method stub
FragmentManager fm = getActivity().getSupportFragmentManager();
mThreadFragment = (ConnectToServerForResults) fm.findFragmentByTag(ConnectToServerForResults.class.getName());
if(mThreadFragment == null)
{
mThreadFragment = new ConnectToServerForResults();
fm.beginTransaction().add(mThreadFragment, ConnectToServerForResults.class.getName()).commit();
}
if(!mThreadFragment.isRunning())
{
mThreadFragment.startSendFeedBack(3, preventSQLInjections(),getResources().getString(R.string.app_name));
}
else
{
//Work in progress :D
}
}
Worker Fragment 启动任务方法
public void startSendFeedBack(int requestCode,String feedback,String appName)
{
XAMPP_URL ="http://10.0.2.2/testStuff/feed.php";
http = new HTTPConnection();
http.execute(String.valueOf(requestCode),XAMPP_URL,feedback,appName);
mRunning = true;
}
Worker Fragment OnAttach
@Override
public void onAttach(Activity activity)
{
// TODO Auto-generated method stub
super.onAttach(activity);
Log.d("ERSEN", "onAttach");
if(!(activity instanceof ResultAsyncTaskCallbacks))
{
throw new IllegalStateException("activity must implement the AsyncTaskCallbacks interface.");
}
mCallback = (ResultAsyncTaskCallbacks) activity;
}
【问题讨论】:
-
您发布的文章中针对 mCallbacks 的所有方法调用都被空检查包围。你是如何得到 NullPointerException 的?另外,您如何以及在哪里开始后台任务?您可以在 TaskFragment 中添加一些逻辑,以确保任务仅在调用 onAttach 后启动。
-
你能发布一些代码吗?如何启动异步任务以及如何将片段添加到活动中?
-
嗨。我添加了一些代码。 @Karakuri,我没有围绕 mCallbacks 被调用的空检查。
-
@Karakuri,您能否向我解释一下您提到的逻辑,我可以在 myTaskFragment 中添加以确保任务仅在调用 onAttach 后开始
-
使用布尔值
isAttached,在onAttach中设置为true,在onDetach中设置为false。制作另一个布尔值pending。当您告诉片段开始工作时,如果isAttached为假,则将pending设置为真。在下一次附加时,如果pending为真,则启动任务并将pending设置为假。