【发布时间】:2014-07-02 16:31:13
【问题描述】:
我正在尝试显示 wifi 数据。好吧,我正在从广播接收器获取数据,然后我试图在 listView 中显示它并在进度条中显示 wifi 信号强度。每次我在 onReceive 方法中有新数据时,都必须更新列表和 progressBare。
但是 progressBar 只是在第一个项目中工作,就像这张图片中一样。
这是我正在使用的活动:
public class WiFiScanResult extends ActionBarActivity {
ListView list1 ;
Receiver receiver = new Receiver();
List<ScanResult> results ;
private ProgressBar progressBar;
int channelNumber;
private Handler mHandler = new Handler();
WifiManager wifi;
Button enab;
String resultsString ;
String[] myStringArray;
int aa = 10;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_wi_fi_scan_result);
ConnectivityManager cxMgr = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
wifi = (WifiManager)getSystemService(Context.WIFI_SERVICE);
list1 = (ListView) findViewById(R.id.listWifi);
registerReceiver(receiver,new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
}
public class Receiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Log.i("onReceive","onReceive");
if(intent.getAction().equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)){
results = wifi.getScanResults();
}
MonAdaptateurDeListe adaptateur = new MonAdaptateurDeListe();
list1.setAdapter(adaptateur);
}
}
private class MonAdaptateurDeListe extends ArrayAdapter<ScanResult> {
int pos ;
TextView text;
public MonAdaptateurDeListe(){
super(WiFiScanResult.this,R.layout.item_layout,results);
}
@SuppressLint("DefaultLocale")
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View itemView = convertView;
if (itemView == null){
itemView = getLayoutInflater().inflate(R.layout.item_layout, parent, false);
}
progressBar = (ProgressBar) findViewById(R.id.progressBar1);
ImageView imageView = (ImageView)itemView.findViewById(R.id.imageView1);
TextView textView4 = (TextView) itemView.findViewById(R.id.level);
imageView.setImageResource(R.drawable.network);
if (results != null)
{
pos = position;
text = textView4 ;
text.setText(results.get(pos).level+"dBm");
Handler progressBarHandler = new Handler();
progressBarHandler .post(new Runnable() {
public void run() {
progressBar.setProgress(10);
}
});
TextView textView1 = (TextView) itemView.findViewById(R.id.SSIDBssid);
textView1.setText( results.get(position).SSID +"(" + results.get(position).BSSID +")");
}
return itemView;
}
}
//We unregister the broadcastreceiver quand on termine
@Override
protected void onDestroy (){//à la sortie de l'app on annule l'enregistrement
super.onDestroy();
if (receiver != null) {
Toast.makeText(this, "Disabled broadcst receiver", Toast.LENGTH_SHORT).show();
WiFiScanResult.this.unregisterReceiver(receiver);
}
}
}
PS:当我将此代码放在 onReceive 方法上时,我会得到如图所示的结果,
MonAdaptateurDeListe adaptateur = new MonAdaptateurDeListe();
list1.setAdapter(adaptateur);
但是当我把它放在 onCreate 方法中时,我得到了一个异常:
05-14 15:58:26.232: E/AndroidRuntime(21044): FATAL EXCEPTION: main
05-14 15:58:26.232: E/AndroidRuntime(21044): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.debitdistance/com.example.debitdistance.WiFiScanResult}: java.lang.NullPointerException
05-14 15:58:26.232: E/AndroidRuntime(21044): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2343)
05-14 15:58:26.232: E/AndroidRuntime(21044): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2395)
05-14 15:58:26.232: E/AndroidRuntime(21044): at android.app.ActivityThread.access$600(ActivityThread.java:162)
05-14 15:58:26.232: E/AndroidRuntime(21044): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1364)
05-14 15:58:26.232: E/AndroidRuntime(21044): at android.os.Handler.dispatchMessage(Handler.java:107)
05-14 15:58:26.232: E/AndroidRuntime(21044): at android.os.Looper.loop(Looper.java:194)
05-14 15:58:26.232: E/AndroidRuntime(21044): at android.app.ActivityThread.main(ActivityThread.java:5371)
05-14 15:58:26.232: E/AndroidRuntime(21044): at java.lang.reflect.Method.invokeNative(Native Method)
05-14 15:58:26.232: E/AndroidRuntime(21044): at java.lang.reflect.Method.invoke(Method.java:525)
05-14 15:58:26.232: E/AndroidRuntime(21044): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
05-14 15:58:26.232: E/AndroidRuntime(21044): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
05-14 15:58:26.232: E/AndroidRuntime(21044): at dalvik.system.NativeStart.main(Native Method)
05-14 15:58:26.232: E/AndroidRuntime(21044): Caused by: java.lang.NullPointerException
05-14 15:58:26.232: E/AndroidRuntime(21044): at android.widget.ArrayAdapter.getCount(ArrayAdapter.java:330)
05-14 15:58:26.232: E/AndroidRuntime(21044): at android.widget.ListView.setAdapter(ListView.java:466)
05-14 15:58:26.232: E/AndroidRuntime(21044): at com.example.debitdistance.WiFiScanResult.onCreate(WiFiScanResult.java:67)
05-14 15:58:26.232: E/AndroidRuntime(21044): at android.app.Activity.performCreate(Activity.java:5122)
05-14 15:58:26.232: E/AndroidRuntime(21044): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1081)
05-14 15:58:26.232: E/AndroidRuntime(21044): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2307)
05-14 15:58:26.232: E/AndroidRuntime(21044): ... 11 more
上哪一点:list1.setAdapter(adaptateur);
【问题讨论】:
-
嗨。你能提交你的整个堆栈跟踪错误吗?此代码是 alpha/beta 还是生产代码。我问的原因是,如果你稍微重构一下你的代码(只是一个建议),你可以做一些事情来让你的生活更轻松。
-
我添加了孔堆栈跟踪(以防我将 list1 放在 onCreate 中)。任何使这段代码更好、更简单的建议对我来说都是非常有帮助的。谢谢@Pintac
标签: android listview broadcastreceiver android-progressbar