我想在我的应用程序启动时发出初始化请求。然后我想在main活动中使用响应。我不想在活动中提出请求,然后在手机轮换时处理活动生命周期。
所以我在考虑从申请中获得并在那里提出请求。但是,将响应数据发送到MyLauncher活动的最佳方式是什么?
这里有“最佳实践”解决方案吗?
如果您正在寻找最佳实践,则不应该为此扩展Application类。
有很多方法可以在屏幕旋转时保持您的请求状态。
考虑使用保留的片段。深入讨论了这种方法:
理解片段的setRetainInstance(布尔值)
进一步理解setRetainInstance(true)
您需要做的就是:
public class RequestFragment extends Fragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// This will be a guarantee that request is sent only once,
// because fragment won't be recreated on screen rotation:
setRetainInstance(true);
// Pereform sending request here.
}
}
public class MainActivity extends AppCompatActivity {
private final static TAG_FRAGMENT = "persistent_fragment";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FragmentManager fm = getSupportFragmentManager();
// Create fragment if it doesn't exist yet.
if (fm.findFragmentByTag(TAG_FRAGMENT) == null) {
fm.beginTransaction()
.add(new RequestFragment(), TAG_FRAGMENT)
.commit();
}
}
}
但是,如果您强烈决定在ApplicationonCreate()
方法中执行请求,则必须实现一个可观察对象,该对象响应订阅它的活动,因为您无法从应用程序类访问活动。
您可以尝试以下方法:
public class ResponseObservale {
private MainActivity activity;
private Response response;
public void sendRequest() {
// perform your async request here.
}
/*
* Consider this method as a point where the response is delivered.
* It can be done in onPostExecute of AsyncTask or somewhere else,
* depending on your implementation.
*/
public void onResponse(Response response) {
this.response = response;
publishResponse();
}
public void onActivityCreated(MainActivity activity) {
this.activity = activity;
if (response != null) {
publishResponse();
}
}
private void publishResponse() {
if (activity != null) {
activity.obtainResponse(response);
}
}
public void onActivityDestroy() {
activity = null;
}
}
public class MyApplication extends Application {
private ResponseObservable observable;
@Override
public void onCreate() {
super.onCreate();
observable = new ResponseObservable();
observable.sendRequest();
}
public ResponseObservable getObservable() {
return observable;
}
}
public class MainActivity extends AppCompatActivity {
private ResponseObserbale observable;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MyApplication app = (MyApplication) getApplicationContext();
observable = app.getObservable();
observable.onActivityCreated(this);
}
public void obtainResponse(Response response) {
// Manage your response here.
}
@Override
protected void onDestroy() {
observable.onActivityDestroy();
}
}
不要忘记在AndroidManifest中声明应用程序类。xml
:
<application
android:name="com.yournamespace.appname.MyApplication"
android:icon="@drawable/icon"
android:label="@string/app_name">
您可以尝试使用类似于库的事件总线,以便在请求任务完成后接收活动中的数据。通过这样做,您就不必担心呼叫来自何处,也不必担心您的活动是否被轮换或重新创建。
如果这些数据是专门针对您的主活动的,为了保持耦合,我建议从那里触发请求。
我正在开发一个Spring启动应用程序。我想通过请求正文字段“Id”修改请求的响应。 我已经实现了下面的代码,但是在实现的时候输出的仍然只是名字。任何关于实施以下内容的建议都会有所帮助: 下面是请求体: 作为响应,我想将该字段附加到响应id(来自请求正文的字段名)。响应体: MyCustomFilter: 我的请求包装: MultiReadHttpServletRequest.java { } 感
问题内容: 我正在寻找一种从Matlab中启动应用程序的方法。问题是,我的Matlab脚本将一些结果保存到文件中,然后应在关联的应用程序中打开(在这种情况下为Blender)。 我熟悉类似的命令 要么 以及其他一些方法,但实际上,该应用程序是从Matlab PATH启动的,因此它在Matlab目录中查找所需的各种库。例如: 是否有某种方法可以启动使用全局(系统)PATH的应用程序? 不久前,我以为
问题内容: 我可以使用Maven编译并启动Spring项目: 但是,当我使用(包括)将所有jar组合到一个文件中时,在执行过程中总是会得到一个: 我还尝试将架构定义(即等)直接附加到类路径,但是没有成功。 问题答案: Spring命名空间处理程序使用文件和解析。由于具有这些名称的文件存在于不同的Spring jar中,因此可能只有其中一个保留在目标jar之后。 也许您可以手动合并这些文件,然后以某
我正在我的应用程序中开发通知,我对即将到来的意图有一些问题,这让我抓狂。 正常流程:我的应用程序有启动程序活动(活动A,单顶),它显示一个飞溅,然后启动活动B(单顶也是)。 通知:当应用程序在后台时,我在通知栏上显示一个通知,当单击时,它会通过PendingIntent打开应用程序的启动器活动。这个PendingIntent地址为活动A(SingleTop)。但是在这个场景中,它没有打开活动A,而
我在我们的应用程序中有多个活动。其中一个活动是启动活动,这是主要的启动器活动。它启动并初始化几个类,这些类被整个应用程序使用并完成。 然后是用户大部分时间驻留的主要活动。如果应用程序关闭,则在创建通知时,这些类将被销毁,因此应用程序将给出错误(nullpointerexception)。 我们需要做的是如果应用程序关闭,则启动启动器活动,否则将主要活动放在前面。 我在这里尝试了多种解决方案。 解决
问题内容: 在我的android项目中,我有ImageAdapter类,可以在其中传递应用上下文以满足进一步的需求。 问题是我想使ImageAdapter作为一个单例对象,以便从我的所有活动中轻松访问此类的实例。但是我不知道如何将我的活动之一中的getApplicationContext()方法中的应用程序上下文传递给ImageAdapter。那么,有什么“魔术”可以做到以下几点? 也许您还有其他