Android 在服务中打开一个线程并使用处理程序向活动发送消息,此时会出现NullPoint错误
在main活动中,我使用Android 在服务中打开一个线程并使用处理程序向活动发送消息,此时会出现NullPoint错误,android,multithreading,handler,Android,Multithreading,Handler,在main活动中,我使用startService(intent)启动服务。在该服务中,我每两秒钟打开一个计时器以获取数据(我在这里说的数据被假定为时间),然后我在计时器中打开一个线程以将该数据存储到ArrayBlockingQueue实例中,因为我担心存储数据的操作会阻塞获取数据的线程。我将使用数据显示在一个自定义的视图组中,其中垂直放置了三个textView。事实上,我真正的需求是实时显示前2秒、前4秒、前6秒的数据。我是一个新的Android开发者,这个问题困扰了我很长时间,我希望有人能给我
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那么你是说我最好使用广播?是的,举个例子。使用广播。这就是服务与活动沟通的方式好的,非常感谢。我会努力的@穆罕默德