调用arrayAdapter.notifyDataSetChanged()时,应用程序崩溃

时间:2015-02-13 08:15:38

标签: java android android-layout

public class Activity_search extends ActionBarActivity {

private BluetoothAdapter mBtAdapter;
private ArrayAdapter<String> mArrayAdapter;
private ArrayList<String> mArrayList;
private boolean isDiscovering;

private AdapterView.OnItemClickListener mClickListener = new AdapterView.OnItemClickListener(){
    public void onItemClick(AdapterView<?> adapterView,View view,int position, long id ){
        mBtAdapter.cancelDiscovery();
        isDiscovering=false;
        Toast.makeText(getApplicationContext(),"Selected",Toast.LENGTH_SHORT).show();
        String tmp1 = ((TextView)view).getText().toString();
    }
};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_activity_search);
    IntentFilter filter = new IntentFilter();
    filter.addAction(BluetoothDevice.ACTION_FOUND);
    filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
    registerReceiver(mReceiver, filter);
    mArrayList = new ArrayList<String>();
    ArrayAdapter<String> mArrayAdapter = new ArrayAdapter<String>(this,R.layout.listview_row,mArrayList);
    ListView listView = (ListView)findViewById(R.id.listView);
    listView.setAdapter(mArrayAdapter);
    listView.setOnItemClickListener(mClickListener);

}


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

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}

private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if(BluetoothDevice.ACTION_FOUND.equals(action)){
            BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            String tmp=device.getName() + "\n" + device.getAddress();
            Context appContext = getApplicationContext();
            Toast.makeText(appContext,tmp,Toast.LENGTH_LONG).show();
            mArrayList.add(tmp);
            mArrayAdapter.notifyDataSetChanged();
        }
        if(BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)){
            Toast.makeText(getApplicationContext(),"Discovery Finished",Toast.LENGTH_SHORT).show();
        }
    }
};


public void onBtn2Clicked(View view) {
    mBtAdapter = BluetoothAdapter.getDefaultAdapter();
    Context appContext = getApplicationContext();
    if(!isDiscovering) {
        mBtAdapter.startDiscovery();
        Toast.makeText(appContext, "Discovery Started", Toast.LENGTH_SHORT).show();
        isDiscovering=true;
    } else {
        mBtAdapter.cancelDiscovery();
        Toast.makeText(appContext,"Discovery Canceled",Toast.LENGTH_SHORT).show();
        isDiscovering=false;
    }
}

public void onDestroy(){
    super.onDestroy();
    if(mBtAdapter.isDiscovering()){
        mBtAdapter.cancelDiscovery();
    }
    unregisterReceiver(mReceiver);
}
}

应用程序总是在调用上面提到的函数时崩溃,其错误代码是

02-13 16:04:47.974  27328-27328/com.skyjohn.nxtrpc E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.RuntimeException: Error receiving broadcast Intent { act=android.bluetooth.device.action.FOUND flg=0x10 (has extras) } in com.skyjohn.nxtrpc.Activity_search$2@41532570
        at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:798)
        at android.os.Handler.handleCallback(Handler.java:800)
        at android.os.Handler.dispatchMessage(Handler.java:100)
        at android.os.Looper.loop(Looper.java:194)
        at android.app.ActivityThread.main(ActivityThread.java:5371)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:525)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
        at dalvik.system.NativeStart.main(Native Method)
 Caused by: java.lang.NullPointerException
        at com.skyjohn.nxtrpc.Activity_search$2.onReceive(Activity_search.java:90)
        at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:788)
        at android.os.Handler.handleCallback(Handler.java:800)
        at android.os.Handler.dispatchMessage(Handler.java:100)
        at android.os.Looper.loop(Looper.java:194)
        at android.app.ActivityThread.main(ActivityThread.java:5371)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:525)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
        at dalvik.system.NativeStart.main(Native Method)

但是如果我将mArrayList.add(&#34; abc&#34;)硬编码到代码中,那么&#34; abc&#34;将出现,但如果我动态地(当我收到一个新的蓝牙设备),应用程序崩溃。

2 个答案:

答案 0 :(得分:0)

  

引起:java.lang.NullPointerException           在com.skyjohn.nxtrpc.Activity_search $ 2.onReceive

mArrayAdapternull,因为在onCreate方法中创建了适配器的新对象,该方法具有相同的名称,声明为类级别。

修复错误使用:

mArrayAdapter = new ArrayAdapter<String>(this,R.layout.listview_row,mArrayList);

onCreate方法中,而不是创建ArrayAdapter的新对象。

答案 1 :(得分:0)

onCreate内,您隐藏了类成员变量mAdapter的范围,在onCreate的本地范围内声明并初始化它。修复方法是从ArrayAdapter<String>中删除onCreate,仅保留

mArrayAdapter = new ArrayAdapter<String>(this,R.layout.listview_row,mArrayList);