我在Android Studio中编写一个Android应用程序,使用片段中的线程来绘制100个随机值,但是当在绘制所有值之前按下后退按钮时,应用程序崩溃。
有人可以告诉我如何在按下后退按钮时停止线程。
public class fragment_Usuario_Mediciones extends Fragment{
//variables para grafica
private static final Random RANDOM= new Random();
private LineGraphSeries<DataPoint> series;
private int x = 0;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_usuario_mediciones,container,false);
//instancia del GraphView
GraphView graph = (GraphView) rootView.findViewById(R.id.graphView);
//datos
series = new LineGraphSeries<DataPoint>();
graph.addSeries(series);
Viewport viewport = graph.getViewport();
viewport.setXAxisBoundsManual(true);
viewport.setMinX(0);
viewport.setMaxX(100);
viewport.setScrollable(true);
return rootView;
}
@Override
public void onResume() {
super.onResume();
//Simulacion en tiempo real con hilo
new Thread(new Runnable() {
@Override
public void run() {
//añade 100 nuevas entradas
for (int i=0;i<100;i++){
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
AniadirEntrada();
}
});
//consumir pulsos de reloj
try {
Thread.sleep(50);
} catch (InterruptedException e) {
//manejar el error
e.printStackTrace();
}
}
}
}).start();
}
private void AniadirEntrada()
{
series.appendData(new DataPoint(x++,RANDOM.nextDouble()*10d),true,100);
}
public boolean onKeyDown(int keyCode, KeyEvent event)
{
if(keyCode == KeyEvent.KEYCODE_BACK)
{
// getActivity().finish();
return true;
}
return false;
}
}
答案 0 :(得分:0)
定义新的处理程序和runnable:
private Handler handler = new Handler(Looper.getMainLooper());
private Runnable runnable = new Runnable() {
@Override
public void run() {
// Do what ever you want
}
};
开始执行使用 - handler.post(runnable);
在 onpause或onstop 覆盖方法中删除处理程序中的回调:
handler.removeCallbacks(runnable);
或者
handler.removeCallbacksAndMessages(null);
在removeCallbacksAndMessages的文档中,它说......
删除任何待处理的回调帖子并发送其obj为的消息 令牌。如果token为null,则将删除所有回调和消息。
答案 1 :(得分:0)
您可以使用AsyncTask获取数据,如下所示:
private class fetchData extends AsyncTask<URL, Integer, Long> {
protected Long doInBackground(URL... urls) {
// your code here
return someValue;
}
protected void onProgressUpdate(Integer... progress) {
setProgressPercent(progress[0]);
}
protected void onPostExecute(Long result) {
// update the UI here
}
}
此外,您可以使用回调来增强整个代码。
答案 2 :(得分:0)
在您的Android清单中,将您之前的活动声明为父活动。
<activity
android:name=".activities.Detail"
android:label="Detail"
android:screenOrientation="portrait"
android:windowSoftInputMode="adjustPan">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.xyz.app.MainActivity" />
</activity>