Android中主线程和AsyncTask之间的ConcurrentLinkedQueue用法

时间:2016-03-11 15:33:11

标签: java android multithreading android-asynctask

我有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); } } } 会出现什么问题?

我使用片段。

find . -type f

1 个答案:

答案 0 :(得分:1)

首先,你不应该在AsyncTask中有一个无限循环。请改用线程。事实上,如果你的任务花费的时间超过几秒钟,你应该使用一个线程,因为多个任务不能同时执行(默认实现是共享一个任务线程)。

其次 - 您的问题是由于任务永远运行的事实。这意味着当您的新活动启动时,上一个活动的任务(记住返回完成活动)仍在运行。因此,您的旧任务仍在运行,并且它可以访问旧的Activity实例 - 因此是队列的旧实例。活动的新实例是写入队列的新实例,但旧任务无法看到它。

您应该从AsyncTask转移到Thread,这样您就不会遇到单个任务问题。您还应该在活动被销毁时中断线程,并让线程中的循环检查isInterrupted以查看线程是否被中断,如果是,则退出循环以杀死线程。

相关问题