简体   繁体   English

使用runOnUiThread更新Listview

[英]Using the runOnUiThread to update Listview

I have written a thread that uses runOnUiThread to update the listview approximately every 500ms. 我写了一个线程,使用runOnUiThread大约每500ms更新一次listview。 This thread is written outside OnCreate(), but is called from OnCreate. 该线程写在OnCreate()之外,但是从OnCreate调用。 Everything compiles fine, but I seem to be getting an error that tells me that my adapter is null, even though I use that same adapter to "initialize" the listview in OnCreate. 一切编译都很好,但我似乎得到一个错误,告诉我我的适配器是null,即使我使用相同的适配器来“初始化”OnCreate中的列表视图。 I have posted both my code and my log. 我已经发布了我的代码和我的日志。 The main error that I run into, java.lang.NullPointerException, refers to line 454 of the MainActivity, which in this case is adapter.notifyDataSetChanged(); 我遇到的主要错误java.lang.NullPointerException指的是MainActivity的第454行,在本例中是adapter.notifyDataSetChanged(); . Any help would be greatly appreciated. 任何帮助将不胜感激。

MainActivity 主要活动

public class MainActivity extends Activity
{

    // Sensor Constants
    public static String temperature;
    public static String humidity;
    public static String lpg;
    public static String alcohol;
    public static int temperature_int;
    public static int humidity_int;
    public static int lpg_int;
    public static int alcohol_int;


    // Layout
    ListView listView;
    ItemAdapter adapter;


    // USB
    UsbManager USB_Manager;
    UsbDevice Sense;
    PendingIntent permission;
    IntentFilter filter;
    //BroadcastReceiver receiver;
    //USBBuffer_s_received_data = 0;


    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        //Initialize Interface
        Model.LoadModel();
        listView = (ListView) findViewById(R.id.listView);
        String[] ids = new String[Model.Items.size()];
        for (int i= 0; i < ids.length; i++)
        {ids[i] = Integer.toString(i+1);}
        ItemAdapter adapter = new ItemAdapter(this,R.layout.row, ids);
        listView.setAdapter(adapter);

        //USB
        if ((UsbManager) getSystemService(Context.USB_SERVICE) != null)
        {
            USB_Manager = (UsbManager) getSystemService(Context.USB_SERVICE);
            if (USB_Manager.getDeviceList().values().iterator().next() != null)
            {
                Sense = USB_Manager.getDeviceList().values().iterator().next();
                if ((UsbDevice) getIntent().getParcelableExtra(UsbManager.EXTRA_DEVICE) != null)
                {
                    Sense = (UsbDevice) getIntent().getParcelableExtra(UsbManager.EXTRA_DEVICE);
                }
            }
        }


        // Update Layout
        temperature_int = 30; humidity_int = 6; lpg_int = 5000; alcohol_int = 500;
        temperature = String.valueOf(temperature_int);
        humidity = String.valueOf(humidity_int);
        lpg = String.valueOf(lpg_int);
        alcohol = String.valueOf(alcohol_int);


        Model.LoadModel();
        listView.setAdapter(adapter);
        adapter.notifyDataSetChanged();
        GUI_Update();
    }   

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    private void GUI_Update()
    {
        new Thread()
        {
            public void run()
            {
                while (true)
                {
                    try
                    {
                        runOnUiThread(new Runnable()
                        {
                            @Override
                            public void run()
                            {
                                Model.LoadModel();
                                listView.setAdapter(adapter);
                                adapter.notifyDataSetChanged();
                            }
                        });
                        Thread.sleep(500);
                    }
                    catch (InterruptedException e)
                    {
                    }
                }
            }
        }.start();
    }
}

Log 日志

12-21 14:39:02.109: D/AndroidRuntime(32704): Shutting down VM
12-21 14:39:02.109: W/dalvikvm(32704): threadid=1: thread exiting with uncaught exception (group=0x4198ac68)
12-21 14:39:02.109: E/AndroidRuntime(32704): FATAL EXCEPTION: main
12-21 14:39:02.109: E/AndroidRuntime(32704): Process: com.byrdonatwigge.sense, PID: 32704
12-21 14:39:02.109: E/AndroidRuntime(32704): java.lang.NullPointerException
12-21 14:39:02.109: E/AndroidRuntime(32704):    at com.byrdonatwigge.sense.MainActivity$2$1.run(MainActivity.java:454)
12-21 14:39:02.109: E/AndroidRuntime(32704):    at android.os.Handler.handleCallback(Handler.java:733)
12-21 14:39:02.109: E/AndroidRuntime(32704):    at android.os.Handler.dispatchMessage(Handler.java:95)
12-21 14:39:02.109: E/AndroidRuntime(32704):    at android.os.Looper.loop(Looper.java:136)
12-21 14:39:02.109: E/AndroidRuntime(32704):    at android.app.ActivityThread.main(ActivityThread.java:5081)
12-21 14:39:02.109: E/AndroidRuntime(32704):    at java.lang.reflect.Method.invokeNative(Native Method)
12-21 14:39:02.109: E/AndroidRuntime(32704):    at java.lang.reflect.Method.invoke(Method.java:515)
12-21 14:39:02.109: E/AndroidRuntime(32704):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:781)
12-21 14:39:02.109: E/AndroidRuntime(32704):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
12-21 14:39:02.109: E/AndroidRuntime(32704):    at dalvik.system.NativeStart.main(Native Method)
@Override
protected void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    //Initialize Interface
    Model.LoadModel();
    listView = (ListView) findViewById(R.id.listView);
    String[] ids = new String[Model.Items.size()];
    for (int i= 0; i < ids.length; i++)
    {ids[i] = Integer.toString(i+1);}
    // change following line:
    this.adapter = new ItemAdapter(this,R.layout.row, ids);

You are creating a local variable adapter in your onCreate() and assigning a new ItemAdapter to it. 您正在onCreate()中创建一个局部变量adapter ,并ItemAdapter分配一个新的ItemAdapter

ItemAdapter adapter = new ItemAdapter(this,R.layout.row, ids);

This is called variable shadowing ; 这称为变量阴影 ; that variable has absolutely nothing to do with the instance field adapter that you're trying to use in GUI_Update() .. which is why it's null there, and throws the NPE. 该变量与您尝试在GUI_Update()使用的实例字段adapter完全无关。这就是为什么它在那里为空,并抛出NPE。

Your IDE should actually be pointing that out to you. 您的IDE实际上应该指出这一点。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM