我有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
答案 0 :(得分:1)
首先,你不应该在AsyncTask中有一个无限循环。请改用线程。事实上,如果你的任务花费的时间超过几秒钟,你应该使用一个线程,因为多个任务不能同时执行(默认实现是共享一个任务线程)。
其次 - 您的问题是由于任务永远运行的事实。这意味着当您的新活动启动时,上一个活动的任务(记住返回完成活动)仍在运行。因此,您的旧任务仍在运行,并且它可以访问旧的Activity实例 - 因此是队列的旧实例。活动的新实例是写入队列的新实例,但旧任务无法看到它。
您应该从AsyncTask转移到Thread,这样您就不会遇到单个任务问题。您还应该在活动被销毁时中断线程,并让线程中的循环检查isInterrupted以查看线程是否被中断,如果是,则退出循环以杀死线程。