Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/184.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 添加到bundle而不提取它_Android_Bundle - Fatal编程技术网

Android 添加到bundle而不提取它

Android 添加到bundle而不提取它,android,bundle,Android,Bundle,我有两节课A类和B类。在类A中,我将一些字符串放入bundle对象中,然后将其发送到类B 我的问题是: 我是否可以直接将一些string或int放入此捆绑包,而无需在B类中提取它,并向其添加额外信息,然后创建一个新捆绑包 *******编辑******* 其他情况: 我已经将一个捆绑包从意图服务发送到活动,然后在活动中我想为这个捆绑包添加一些额外的内容,最后我将把这个捆绑包发送到后台线程以保存sharePreference。我怎么能做到呢?是的,你可以做到。因此,在类B中,当您想要打开类C时,您

我有两节课A类B类。在类A中,我将一些字符串放入bundle对象中,然后将其发送到类B

我的问题是: 我是否可以直接将一些
string
int
放入此捆绑包,而无需在B类中提取它,并向其添加额外信息,然后创建一个新捆绑包

*******编辑******* 其他情况:


我已经将一个捆绑包从意图服务发送到活动,然后在活动中我想为这个捆绑包添加一些额外的内容,最后我将把这个捆绑包发送到后台线程以保存sharePreference。我怎么能做到呢?

是的,你可以做到。因此,在类B中,当您想要打开类C时,您可以从先前的意图中获得捆绑包,然后继续添加到同一捆绑包并打开C

Intent newIntent = new Intent(ActivityB.this, ActivityC.class);
Bundle bundle = getIntent().getExtras();
if (bundle != null) {
    bundle.putString("newKey","newValue");
    newIntent.putExtras(bundle);
}
startActivity(newIntent);
更新

由于您希望在BG线程中传递此捆绑包,并且假设您正在为此使用AsyncTask,您可以执行以下操作-

声明您的异步任务,如下所示-

 class MyBGClass extends AsyncTask<Bundle,Void,Void>{
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }



        @Override
        protected Void doInBackground(Bundle... params) {
            return null;
        }
    }
更新2: 要从resultReceiver传递数据,请执行以下操作-

receiver.send(RESULT_CODE, bundle);
然后在您的活动中,您应该将此resultreceiver传递给您的服务实现

 @Override
protected void onReceiveResult(int resultCode, Bundle resultData) {

    //resultData is your bundle. to add to it -
    if (resultData != null) {
        resultData.putString("newKey","newValue");
    }
}
然后调用你的BG线程

如下所示更改WorkerThread类的构造函数,并在创建类的对象时将包传递给线程-

private class WorkerThread extends HandlerThread {
    private static final int SAVE = 1;
    PreferenceModel instancePreferenceModel;
    Bundle bundle;
    private Handler mHandler;
    public WorkerThread(Bundle bundle) {
        super("WorkerThread", Process.THREAD_PRIORITY_BACKGROUND);
        App app = (App) getApplication();
        this.bundle = bundle;
        instancePreferenceModel = app.getInstancePreferenceModel();
    }

    @Override
    protected void onLooperPrepared() {
        super.onLooperPrepared();

        mHandler = new Handler(getLooper()) {

            @Override // receive message from uiThread as Bundle object.
            public void handleMessage(Message msg) {

                switch (msg.what) {

                    case SAVE:
                        Log.i(TAG, "handleMessage: saved completed");
                        Bundle data = (Bundle) msg.obj;
                        Log.i(TAG, "getData: " + data.getString(LoginIntentService.EXTRA_FIRST_NAME));
                        instancePreferenceModel.saveUserInfo(data);
                        break;
                }

            }

        };

    }

    // this method is access to main ui thread.by this method UiThread can send a Message
    // Background Thread
    public void write(Bundle b) {
        Message msg = new Message();
        msg.obj = b;
        Message obtain = Message.obtain(mHandler, SAVE, msg.obj);
        mHandler.sendMessage(obtain);
    }

}

实际上,我已经通过resultReceiver将包从Intent服务发送到我的活动。我只想在这个包中添加一些额外的内容,然后将其发送到另一个类以保存到sharePreference。我怎么能这么做?你也可以这么做。因此,在你的活动中使用上面的代码,你想从中发送到另一个类(我想是另一个活动或片段吧?),我将此捆绑包从intent service发送到activity,然后在activity中我想为此捆绑包添加一些额外的内容,最后我将此捆绑包发送到后台线程以保存在SharePreference上为什么要保存在BG线程中的Shared Pref中?所以,对于额外的部分,你可以自己这样做。然后,您可以直接将捆绑包作为方法参数传递给另一个活动,而不是通过意图将其传递给另一个活动。因为在我的活动中,我有一个对话框,用户必须输入其他信息。然后,我希望将此新信息与旧捆绑包混合,并发送到后台线程,以便savingsayres kabir,因为您是一名非常优秀的程序员,试一试,看看C类是否可以读取B类中的附加值?@Alessio,事实上,第二种情况是我的主要问题。有什么好的理由要将它从后台线程保存到SP吗?对SP的访问和存储速度足够快,您可以从UI线程执行,而不会出现任何问题。只需确保持久化像字符串和int这样的快速数据,而不是在持久化之前动态地将json解析为字符串(即使在这种情况下仍然是可以实现的,而且优秀的程序员可以轻松地对其进行度量)@alesio。因为在我的活动中,我有一个对话框,用户必须输入额外的信息。然后我想将这个新信息与旧的捆绑包混合,并发送到后台线程进行保存。您仍然没有解释为什么您希望在后台线程中发生这种情况。您可以直接从对话框中执行,无需将逻辑移动到后台线程。如果你真的想这样做,是的,你仍然可以。Bundle是一个对象,所以您可以毫无问题地传递和操作它。我仍然认为这个标题和你的问题有误导性,所以试一下,看看你能怎么做。
private class WorkerThread extends HandlerThread {
    private static final int SAVE = 1;
    PreferenceModel instancePreferenceModel;
    Bundle bundle;
    private Handler mHandler;
    public WorkerThread(Bundle bundle) {
        super("WorkerThread", Process.THREAD_PRIORITY_BACKGROUND);
        App app = (App) getApplication();
        this.bundle = bundle;
        instancePreferenceModel = app.getInstancePreferenceModel();
    }

    @Override
    protected void onLooperPrepared() {
        super.onLooperPrepared();

        mHandler = new Handler(getLooper()) {

            @Override // receive message from uiThread as Bundle object.
            public void handleMessage(Message msg) {

                switch (msg.what) {

                    case SAVE:
                        Log.i(TAG, "handleMessage: saved completed");
                        Bundle data = (Bundle) msg.obj;
                        Log.i(TAG, "getData: " + data.getString(LoginIntentService.EXTRA_FIRST_NAME));
                        instancePreferenceModel.saveUserInfo(data);
                        break;
                }

            }

        };

    }

    // this method is access to main ui thread.by this method UiThread can send a Message
    // Background Thread
    public void write(Bundle b) {
        Message msg = new Message();
        msg.obj = b;
        Message obtain = Message.obtain(mHandler, SAVE, msg.obj);
        mHandler.sendMessage(obtain);
    }

}