2012-10-05 64 views
0

小小的解释,我想要做的必要: 我需要从另一个线程更新我的活动的UI。但是从那个线程不可访问的非静态函数/卷,没有静态的bcs我无法通过PhonePadActivity.uaReceiverHandler(msg)方式从外部类调用代码(也来自该线程静态引用Activity - PhonePadActivity.phonePadActvity始终为空并导致例外)。但是,当我传入使用静态处理程序时,所有静态引用也始终为空,这不会给我更新UI的可能性(简单的findViewByID产品编译器错误无法从非静态引用静态方法)。所以,只有PhonePadActivity.uaReceiverHandler(msg)从另一个线程工作,可以改变本地私有静态变量,但不能访问查看对象)我该如何解决它?findViewById在handleMessage内返回null

我是通过手柄的消息收好消息:

public static final Handler uaReceiverHandler = new Handler(){ 

    @Override 
    public void handleMessage(Message msg) { 
     Bundle b = msg.getData(); 
     Log.e(THIS_FILE, "WAS regState" + regState); 
     regState = b.getString("regState"); 
     TextView statusLocal = (TextView) phonePadForUsing.findViewById(R.id.registrationStatus); 

     statusLocal.setText("Registered"); 

    } 
}; 
在我的情况

public class PhonePadActivity extends Activity { 
     public static PhonePadActivity phonePadForUsing; 
     private static TextView status; 

其中分配:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_phone_pad); 
    phonePadForUsing = this; 
    status = ((TextView) phonePadForUsing.findViewById(R.id.registrationStatus)); 

此代码工作正常,regState分配同样,但phonePadForUsing总是返回null豁免,此代码:

 status.setText("Registered"); 

返回完整跟踪:

10-05 13:34:51.495:E/AndroidRuntime(12744): 显示java.lang.NullPointerException 10-05 13:34:51.495: E/AndroidRuntime(12744):at com.callsfreecalls.android.PhonePadActivity $ 4.handleMessage(PhonePadActivity.java:1180) 10-05 13:34:51.495:E/AndroidRuntime(12744):at android.os.Handler.dispatchMessage (Handler.java:99)10-05 13:34:51.495:E/AndroidRuntime(12744):at android.os.Looper.loop(Looper.java:123)1 0-05 13:34:51.495: E/AndroidRuntime(12744):at android.app.ActivityThread.main(ActivityThread.java:4627)10-05 13:34:51.495:E/AndroidRuntime(12744):在 java.lang.reflect.Method.invokeNative(Native Method)10-05 13:34:51.495:E/AndroidRuntime(12744):at java.lang.reflect.Method.invoke(Method.java:521) 10-05 13:34:51.495: E/AndroidRuntime(12744):at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:868) 10-05 13:34:51.495:E/AndroidRuntime(12744):at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)10-05 13:34:51.495:E/AndroidRuntime(12744):at dalvik.system.NativeStart 。嘛在(本机方法)

的onCreate被解雇之前,因此,所有的元素都已经完成,BCS我已经登录的OnCreate(如u见,它10秒比年初例外...:

10-05 13:34:41.535:d/PhonePad(12735):的onCreate:创建

任何建议将理解的是,请包括的代码和平。相同的代码可以很好地与另一个使用另一个类的Handler配合使用:

final static Handler clientControllerHandler = new Handler(){ 
    @Override 
    public void handleMessage(Message msg) { 
     final TextView status = ((TextView) phonePadForUsing.findViewById(R.id.registrationStatus)); 
     status.setText("Data not received"); 
+2

永远不要将您的活动的实例引用到STATIC对象。这是一个很糟糕的做法。 – waqaslam

+0

full stacktrace – njzk2

+0

@Waqas如果我不使用静态我无法从hangerMessage访问UI。任何建议?我有错误无法静态引用非静态方法) – user170317

回答

1

好的,首先,按照可行的方法。通常所有UI元素都在onCreate()中初始化。然后在您的处理程序中访问它。

public static final Handler uaReceiverHandler = new Handler(){ 

@Override 
public void handleMessage(Message msg) { 
    Bundle b = msg.getData(); 
    Log.e(THIS_FILE, "WAS regState" + regState); 
    regState = b.getString("regState"); 
    //More this to onCreate(), make statusLocal a global variable. 
    TextView statusLocal = (TextView) phonePadForUsing.findViewById(R.id.registrationStatus); 

    statusLocal.setText("Registered"); 

} }; 
+0

我想你错了,我更新的问题,你可以看到,onCreate之前被解雇。还有其他建议吗? – user170317

+0

从处理程序中删除注册。无需两次注册相同的东西。 –

+0

我很新的android,请,代码的一些和平将赞赏。注册去除在哪里以及如何? – user170317

0

看着你stacktract:

PhonePadActivity.java:1180

抛出空指针异常 - 这意味着你解引用变量未初始化或为空。

并小心查看你的代码显示处理程序是静态类 - 因此它没有引用原始实例 - 所以即使你初始化它的引用也可以为null。

只需在此调用之前添加日志语句,以便您可以看到发生了什么。

+0

是的,我知道。问题是从另一个类调用的相同代码工作正常。但是从另一个线程调用的相同代码不起作用。我如何改变它的代码? – user170317

+0

请阅读我的解释。我敢肯定,变量初始化bcs相同的变量从另一个类非空(差异只是静态/非静态处理程序引用类型。任何建议?也许我可以初始化和访问将来没有null造成的? – user170317