我有ConcurrentLinkedQueue
和队列在主线程中更新,并且AsyncTask
显示ConcurrentLinkedQueue
中的数据。它在第一次发射时可以正常工作。Android中主线程和AsyncTask之间的ConcurrentLinkedQueue使用情况
如果应用程序被后退键或主键停止,那么应用程序正在重新启动,问题就在那里。在主线程中,队列有数据,但在AsyncTask
中,队列长度为零。
但是,应用程序被强制停止并重新启动,那就没事了。
这个Queue
有什么问题?
我使用片段。
public class OneFragment extends Fragment implements SensorEventListener {
Queue<Float> queuex = new ConcurrentLinkedQueue<Float>();
Queue<Float> queuey = new ConcurrentLinkedQueue<Float>();
Queue<Float> queuez = new ConcurrentLinkedQueue<Float>();
public void onCreate(Bundle savedInstanceState) {
}
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
}
@Override
public void onSensorChanged(SensorEvent event) {
queuex.add(Float.valueOf(deltaX));
queuey.add(Float.valueOf(deltaY));
queuez.add(Float.valueOf(deltaZ));
}
protected class Update extends AsyncTask<Context, Integer, String> {
float x_,y,z;
@Override
protected String doInBackground(Context... params) {
int i = 0;
while (true) {
try {
if(!queuez.isEmpty()) { //Always zero after relaunch if the app is stopped by pressing home or back buttons.
Float g_x = queuex.poll();
x_ = g_x.floatValue();
Float g_y = queuey.poll();
y = g_y.floatValue();
Float g_z = queuez.poll();
z = g_z.floatValue();
publishProgress(i);
i++;
if(systemON == true)
mVibrator.vibrate(1000);
}
} catch (Exception e) {
}
}
//return "COMPLETE!";
}
// -- gets called just before thread begins
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
mSeriesX.add(x, x_);
mSeriesY.add(x, y);
mSeriesZ.add(x++, z);
if(x%50 == 0) {
mRenderer.setXAxisMin(x);
mRenderer.setXAxisMax(x+50);
}
if (mChartView != null) {
mChartView.repaint();
}
}
// -- called if the cancel button is pressed
@Override
protected void onCancelled() {
super.onCancelled();
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
}
}
}
你在哪里实例化Update?也许可以考虑使用'队列'而不是三个队列。 –
tynn