跨类访问数组值

时间:2011-02-05 14:52:48

标签: android

我有一项活动,其中包含

的声明
public String progressArray[][] = new String[3][3]

在另一个文件(服务)中,我想访问此数组的值。我代码:

ListViewLoader lvl = new ListViewLoader

现在我发现lvl.progressArray[0][0]返回null虽然我知道数据已经放在它自己的类中。这是因为新实例不包含原始值,如果是这样,我如何访问原始值?

3 个答案:

答案 0 :(得分:0)

如果您希望始终由该Activity启动Service,则可以使用启动Service的intent将String数据发送到Service。 您可以使用putExtra和getExtra方法实现此目的:

Intent serviceIntent = new Intent( this, myService.class );
serviceIntent.putExtra( "pa_0_0", progressArray[0][0] );
serviceIntent.putExtra( "pa_0_1", progressArray[0][1] );
//...
serviceIntent.putExtra( "pa_2_2", progressArray[2][2] );
startService( serviceIntent );

您可以通过覆盖其onStartCommand方法将服务中的字符串重新取出,其中包括将服务作为参数启动的意图。

   progressArrayCopy[0][0] =  mIntent.getStringExtra( "pa_0_0" );

答案 1 :(得分:0)

嗯......听起来更像是编程问题,而不是Android相关。如果你有一个类,并且你有一个数组声明,就像你上面的情况一样,那个类的任何新实例也不会包含该数组的新实例。假设您有一个其他类使用的类,并将其值设置为class.progressArray[0][0] = ...,然后在其他类中要访问这些存储的值,您必须 <该类的强>相同实例,以便恢复存储的值。

通常在编程中你有不同的可能性:

  • 您传递包含数据的创建实例,即通过构造函数或某些公共setter方法或
  • 在该类上创建一个静态类/静态属性,在所有实例上都是相同的(请注意)
  • 您创建了一个singleton,这意味着在整个应用程序的整个生命周期中只有一个实例

答案 2 :(得分:0)

您的解决方案无法正常工作,因为progressArray是一个实例变量并且在调用

ListViewLoader lvl = new ListViewLoader

创建新实例,其中progressArray设置为默认值(在这种情况下为null)。使progressArray静态可以是一个快速的解决方案,但请注意,您将高度依赖于活动和服务将访问该阵列的顺序,并且当您的活动被系统销毁时可能会重置它。我非常劝阻你这样做。相反,请考虑扩展Application class并在那里实施列表初始化/访问,例如:

public class MyApplication extends Application {
    public String progressArray[][] = new String[3][3];
}

然后在AndroidManifest中声明它:

<application
            android:name=".MyApplication"
            android:label="@string/app_name"
            android:icon="@drawable/icon">

然后,您可以通过调用

从您的活动和服务中获得
((MyApplication) getApplication()).progressArray

这是在我知道的一个应用程序之间共享活动和服务之间状态的唯一方法,既不涉及来回发送消息以保持状态一致(这可能是非常重要的任务)也不是使用单例({{3} })。

但请记住,以这种方式共享可变数据的需求可能暗示,您的设计需要改进。