findViewById在handleMessage中返回null

时间:2012-10-05 10:11:05

标签: android

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

我收到处理消息的消息:

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)10-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):at   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.main(原生方法)

onCreate之前被解雇了,所以,所有元素都已经完成了,bcs我已登录OnCreate(正如你所见,它早于异常10秒......:

  

10-05 13:34:41.535:D / PhonePad(12735):onCreate:created

任何建议都会受到赞赏,请包括代码的和平。相同的代码从另一个使用另一个类的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 个答案:

答案 0 :(得分: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");  

}  };  

答案 1 :(得分:0)

查看你的stacktract:

PhonePadActivity.java:1180

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

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

只需在此调用之前添加日志语句,以便查看会发生什么。