Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在服务中打开一个线程并使用处理程序向活动发送消息,此时会出现NullPoint错误_Android_Multithreading_Handler - Fatal编程技术网

Android 在服务中打开一个线程并使用处理程序向活动发送消息,此时会出现NullPoint错误

Android 在服务中打开一个线程并使用处理程序向活动发送消息,此时会出现NullPoint错误,android,multithreading,handler,Android,Multithreading,Handler,在main活动中,我使用startService(intent)启动服务。在该服务中,我每两秒钟打开一个计时器以获取数据(我在这里说的数据被假定为时间),然后我在计时器中打开一个线程以将该数据存储到ArrayBlockingQueue实例中,因为我担心存储数据的操作会阻塞获取数据的线程。我将使用数据显示在一个自定义的视图组中,其中垂直放置了三个textView。事实上,我真正的需求是实时显示前2秒、前4秒、前6秒的数据。我是一个新的Android开发者,这个问题困扰了我很长时间,我希望有人能给我

在main活动中,我使用
startService(intent)
启动服务。在该服务中,我每两秒钟打开一个计时器以获取数据(我在这里说的数据被假定为时间),然后我在计时器中打开一个线程以将该数据存储到
ArrayBlockingQueue
实例中,因为我担心存储数据的操作会阻塞获取数据的线程。我将使用数据显示在一个自定义的视图组中,其中垂直放置了三个textView。事实上,我真正的需求是实时显示前2秒、前4秒、前6秒的数据。我是一个新的Android开发者,这个问题困扰了我很长时间,我希望有人能给我帮助。非常感谢

这是我所有的源代码

MainActivity.java

public class MainActivity extends AppCompatActivity {
    private TemperatureCarouselView mView;
    private TextView temp, tv1, tv2, tv3;
    public static Handler mHandler;
    public static int FLAG = 1;
    private Intent timeService = null;
    public static BlockingQueue<String> data = new ArrayBlockingQueue<String>(4);
    Object object[];

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        temp = (TextView) findViewById(R.id.temperature);
        mView = (TemperatureCarouselView) findViewById(R.id.tempView);
        tv1 = mView.getTv1();
        tv2 = mView.getTv2();
        tv3 = mView.getTv3();


        timeService = new Intent(MainActivity.this, DataService.class);
        mHandler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                String str = (String) msg.obj;
                if (msg.what == FLAG) {
                    temp.setText(str);
                    tv1.setText((CharSequence) object[1]);
                    tv2.setText((CharSequence) object[2]);
                    tv3.setText((CharSequence) object[3]);
                }
            }
        };
        startService(timeService);
        object = MainActivity.data.toArray();
    }


    @Override
    protected void onDestroy() {
        super.onDestroy();
        stopService(timeService);
        mHandler.removeMessages(FLAG);
    }
}
public class DataService extends Service {
    private Timer timer = null;
    private SimpleDateFormat sdf = null;
    private String Data = "0";
    private static final String TAG = "DataService";

    @Override
    public void onCreate() {
        super.onCreate();
        Log.i(TAG, "onCreate");
        init();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                Message msg = Message.obtain();
                msg.what = MainActivity.FLAG;
                msg.obj = getTime();
                Data = (String) msg.obj;
                Log.i(TAG, "run:  timer----"+Data);
                MainActivity.mHandler.sendMessage(msg);
                DataThread getData = new DataThread();
                getData.start();
            }
        }, 0, 2000);
    }

    private String getTime() {
        return sdf.format(new Date());
    }

    private void init() {
        timer = new Timer();
        sdf = new SimpleDateFormat("HH:mm:ss");
    }


    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        Log.i(TAG, "onBind");
        return null;
    }



    class DataThread extends Thread {
        @Override
        public void run() {
            super.run();
            while (true) {
                try {
                    MainActivity.data.put(Data);
                    Log.i(TAG, "run: getData---"+Data);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

}
错误信息

03-23 02:59:52.6423841-3855/?E/AndroidRuntime:致命异常:计时器-0 进程:com.zhiyu.temperaturecollection,PID:3841 java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“boolean android.os.Handler.sendMessage(android.os.Message)”


内存泄漏。。。。为什么在服务中使用MainActivity的静态处理程序?广播发射器和接收器用于从服务到活动/片段的通信。静态变量看起来很容易实现,但会对你的应用程序造成很大的损害。@MohammedAtif那么你是说我最好使用广播?是的,举个例子。使用广播。这就是服务与活动沟通的方式好的,非常感谢。我会努力的@内存泄漏。。。。为什么在服务中使用MainActivity的静态处理程序?广播发射器和接收器用于从服务到活动/片段的通信。静态变量看起来很容易实现,但会对你的应用程序造成很大的损害。@MohammedAtif那么你是说我最好使用广播?是的,举个例子。使用广播。这就是服务与活动沟通的方式好的,非常感谢。我会努力的@穆罕默德