简体   繁体   English

调用arrayAdapter.notifyDataSetChanged()时应用崩溃

[英]App crashed when arrayAdapter.notifyDataSetChanged() was called

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

App always crashed when it called the function as mentioned at above, And its error code is 如上文所述,当应用程序调用该函数时,它总是崩溃,并且其错误代码为

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)

But if i hardcoded mArrayList.add("abc") into the code, the "abc" will appear, but if I do it dynamicly (when I received a new bluetooth device) , the app crashed. 但是,如果我将mArrayList.add(“ abc”)硬编码到代码中,则将出现“ abc”,但是如果我动态地执行此操作(当我收到新的蓝牙设备时),该应用程序将崩溃。

Caused by: java.lang.NullPointerException at com.skyjohn.nxtrpc.Activity_search$2.onReceive 由:com.skyjohn.nxtrpc.Activity_search $ 2.onReceive上的java.lang.NullPointerException

mArrayAdapter is null because creating new object of Adapter in onCreate method with same name which declare as class level. mArrayAdapternull因为在具有相同名称的onCreate方法中创建了Adapter的新对象,该对象声明为类级别。

To fix error use: 要修复错误,请使用:

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

in onCreate method instead of creating new object of ArrayAdapter . onCreate方法中,而不是创建ArrayAdapter新对象。

inside onCreate you are hiding the scope of the class member variable mAdapter , declaring and initialazing it in the local scope of onCreate . onCreate您将隐藏类成员变量mAdapter的范围,并在onCreate的本地范围内对其进行声明和初始化。 The fix is to remove ArrayAdapter<String> from onCreate , leaving only 解决方法是从onCreate删除ArrayAdapter<String> ,仅保留

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

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

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