0

一点解释,我想做的事情是:我需要从另一个线程更新我的活动的 UI。但是从该线程无法访问的非静态函数/卷,没有静态的 bcs 我无法通过 PhonePadActivity.uaReceiverHandler(msg) 方式从外部类调用代码(也从该线程静态引用到 Activity - PhonePadActivity.phonePadActvity 始终为空并导致例外) 。但是当我传入使用静态处理程序时,所有静态引用也始终为空,这使我无法更新 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): 在 com.callsfreecalls.android.PhonePadActivity$4.handleMessage(PhonePadActivity .java:1180) 10-05 13: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-05 13: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.invokeNative(Native Method) 10-05 13:34:51.495: E/AndroidRuntime(12744): 在 java.lang.reflect .Method.invoke(Method.java:521) 10-05 13:34:51.495: E/AndroidRuntime(12744): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller。运行(ZygoteInit.java:868)10-05 13: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-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");
4

2 回答 2

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

}  };  
于 2012-10-05T10:19:08.130 回答
0

查看您的堆栈信息:

PhonePadActivity.java:1180

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

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

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

于 2012-10-05T11:25:18.467 回答