【问题标题】:Show BroadcastReceiver data in progressBarShow BroadcastReceiver data in progressBar
【发布时间】: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


【解决方案1】:

如果你把它放在 create 中,你的结果在“MonAdaptateurDeListe”中看起来是空的。

而是在创建时将列表(new Arraylist)传递给适配器,然后在接收时设置列表。

还有更多关于设计说明的信息。您的“MonAdaptateurDeListe”对它非常紧密地绑定的活动非常了解。尝试使您的“MonAdaptateurDeListe”独立于使用它的活动。

谢谢

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-16
    • 1970-01-01
    • 2015-10-26
    • 2014-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-27
    相关资源
    最近更新 更多