所以采用这里描述的设计模式,通过这里描述的setRetainInstance,异步任务包装在保留的片段上
http://www.androiddesignpatterns.com/2013/04/retaining-objects-across-config-changes.html
我遇到了一个问题,即在工作程序片段可以附加到活动之前启动一个任务,使mcallback在调用onpreexecute的同时保持为空,这将抛出一个nullpointerexception/
这主要是由于异步任务是通过方法调用(创建内部异步任务实例的启动方法)启动的,而不是在oncreate或onactivitycreated中启动的,因为任务可以再次启动(在其新实例下),并且不能在oncreate或据我所知,由于setRetainInstance的原因,自这些方法的生命周期以来创建的活动只调用了1次。
我的问题是,在哪里可以编程某种类型的例程,其中等待片段已附加到活动例程,如果是这样,您需要做的任务?
多谢。
更新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
}
}
工作片段启动任务方法
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;
}
辅助碎片
@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;
}
最佳答案
所以我做了一个解决问题的方案。也许不是最好的解决办法,但我的问题似乎已经解决了。
我向接口添加了一个调用,名为OnThreadFragmentAttached()
public static interface ResultAsyncTaskCallbacks
{
void onPreExecuteResults();
void onCancelledResults();
void onPostExecuteResults();
void onThreadFragmentAttached();
}
我向工作片段添加了一个类变量
private boolean isFirstTime=true;
开头的布尔值表示片段是第一次添加
在onActivityCreated中,我可以安全地假设片段是附加的,因为这就是该方法的含义。
这就是逻辑。检查first time是否为true(如果片段是第一次添加的,则为yes)。如果调用onThreadFragmentAttached();。将firsttime设置为false,因为片段已添加。由于保留了此片段,因此通过配置更改保留此false。
if(isFirstTime == true)
{
mCallback.onThreadFragmentAttached();
isFirstTime = false;
}
在实现回调的主活动中
@Override
public void onThreadFragmentAttached(int fragmentCode)
{
FB = (FeedBack)fragmentManger.findFragmentByTag(FeedBack.class.getName());
FB.sendFeedback();
}
找到反馈片段(这是我的片段,需要启动一个任务)并调用sendfedback方法。
这是一个简单调用start方法的方法。
public void sendFeedback()
{
mThreadFragment.startSendFeedBack(3, preventSQLInjections(),getResources().getString(R.string.app_name));
}
在我的一次点击中,我有以下逻辑
//Check if there is not a task running at the moment
if(!mThreadFragment.isRunning()) //No task
{
//if its the first time worker fragment is being added it will start the task itself via the onThreadFragmentAttached callback (inside main activity) which then calls the sendFeedBack method that starts the task
if(mThreadFragment.getIsFirstTime() != true) //this is here in cases where the thread fragment is already attached and the task can be started as normal.
{
sendFeedback();
}
}
这将检查片段是否已经添加,然后继续并开始任务。注意getisfirsttime方法只返回类变量isfirsttime的值。如果它的错误继续正常进行,因为它已经附加。如果这是真的,那么将绕过它,并且任务无论如何都将通过onThreadAttachedCallback()启动;
关于android - Android:有没有办法等到 fragment 附着到 Activity 上?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26476202/