当前位置: 首页 > 知识库问答 >
问题:

从应用程序到启动器活动获取异步响应数据

孟英锐
2023-03-14

我想在我的应用程序启动时发出初始化请求。然后我想在main活动中使用响应。我不想在活动中提出请求,然后在手机轮换时处理活动生命周期。

所以我在考虑从申请中获得并在那里提出请求。但是,将响应数据发送到MyLauncher活动的最佳方式是什么?

这里有“最佳实践”解决方案吗?

共有2个答案

雍河
2023-03-14

如果您正在寻找最佳实践,则不应该为此扩展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">
柳鸿信
2023-03-14

您可以尝试使用类似于库的事件总线,以便在请求任务完成后接收活动中的数据。通过这样做,您就不必担心呼叫来自何处,也不必担心您的活动是否被轮换或重新创建。

如果这些数据是专门针对您的主活动的,为了保持耦合,我建议从那里触发请求。

 类似资料:
  • 我正在开发一个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。那么,有什么“魔术”可以做到以下几点? 也许您还有其他