如何将Bundle传递给另一个对象(仅限于AsyncTask线程)?

时间:2015-09-17 16:47:56

标签: android multithreading android-asynctask

我想为AsyncTask线程创建一个Bundle对象,它仍然不受data所做的更改的影响(在将其传递给sendMessage()之后)。 我的代码在调用data后立即删除sendMessage()中的值,但我需要将该值发送到服务器。 有人可以提出一种有效的方法,例如一旦data被传递(它被复制,因为缺少更好的术语)在发送消息的持续时间内并且自己被销毁。
代码

public void sendMessage(final Bundle data)
{
    sendTask = new AsyncTask<Void, Void, String>()
    {
        @Override
        protected String doInBackground(Void... params)
        {
            String id = Integer.toString(msgId.incrementAndGet());
            try
            {
                Log.d(TAG, "message_id: " + id);
                gcm.send(PROJECT_NUMBER + "@gcm.googleapis.com", id, data);
            }
            catch (Exception e)
            {
                Log.d(TAG, "Exception: " + e);
                e.printStackTrace();
            }
            return "GCM send is a success";
        }

        @Override
        protected void onPostExecute(String result)
        {
            super.onPostExecute(result);
            sendTask = null;
            Log.d(TAG, "Result = " + result);
            Toast.makeText(getActivity(), result, Toast.LENGTH_SHORT).show();
        }
    };
    sendTask.execute();
}

1 个答案:

答案 0 :(得分:0)

您可以将数据传递到doInBackground(),步骤如下:

  • 更改AsyncTask sendTask = new AsyncTask<Bundle, Void, String>()

  • 接受的参数类型
  • 现在将protected String doInBackground(Void... params)更改为受保护的字符串doInBackground(Bundle ... params)

  • 您可以使用gcm.send(PROJECT_NUMBER + "@gcm.googleapis.com", id, params[0]);
  • 访问捆绑包
  • 同时将sendTask.execute();更改为sendTask.execute(data);,以便将其传递给异步任务。