Android findViewById在handleMessage内返回null

Android findViewById在handleMessage内返回null,android,Android,小解释,我想做的是必要的: 我需要从另一个线程更新活动的UI。但从该线程不可访问的非静态函数/卷,没有静态的bcs i无法通过PhonePadActivity.uaReceiverHandler(msg)方式从类外调用代码(也可以从该线程静态引用活动-PhonePadActivity.PhonePadActivity始终为null并导致异常)。但当我传入使用静态处理程序时,所有静态引用也总是空的,这使我无法更新UI(简单的findViewByID产品编译器错误不能从非静态引用静态方法)。所以,只

小解释,我想做的是必要的: 我需要从另一个线程更新活动的UI。但从该线程不可访问的非静态函数/卷,没有静态的bcs i无法通过PhonePadActivity.uaReceiverHandler(msg)方式从类外调用代码(也可以从该线程静态引用活动-PhonePadActivity.PhonePadActivity始终为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始终返回空豁免,此代码:

        status.setText("Registered");
返回完整跟踪:

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

onCreate之前被激发过,所以,所有元素都已经完成了,bcs我已经登录onCreate(正如你所看到的,它比异常早10秒…:

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

任何建议都将不胜感激,请包括代码的和平。相同的代码从另一个处理程序运行良好,使用另一个类:

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");

好的,首先,使用有效的方法。通常所有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");  

}  };  

查看您的系统:

java:1180

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

仔细查看您的代码可以发现处理程序是静态类——因此它没有对原始实例的引用——所以即使您初始化了它,您的引用也可能是空的


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

永远不要将您的活动实例引用到静态对象。这是一个非常糟糕的做法。@Waqas如果我不使用静态,我就无法从hangerMessage访问UI。有什么建议吗?我有错误,无法对非静态方法进行静态引用)你们的类的长度超过1180行?@njzk2是的:)我希望这不是编译器错误:)我猜你们错了,我是更新问题,你们可以看到onCreate以前被激活过。还有其他建议吗?从处理程序中删除注册。同样的东西不需要注册两次。我是android的新手,请,希望代码能平静一些。注册删除的位置和方式?删除-->TextView Status Local=(TextView)phonePadForUsing.findViewById(R.id.registrationStatus);来自处理程序。删除该行我是leve only status.setText(“已注册”),但我有相同的空指针异常……是的,我知道。问题是从另一个类调用的同一代码工作正常。但从另一个线程调用的同一代码不起作用。如何更改代码?请阅读我的解释。我确信该变量初始化了bcs同一个变量,该变量来自另一个非null类(区别只是静态/非静态处理程序引用类型。有什么建议吗?也许我以后如何在不导致null的情况下初始化和访问?