按下后退按钮时应用程序崩溃(Android Studio)

时间:2017-04-01 05:50:31

标签: java android multithreading android-fragments

我在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;

}

}

3 个答案:

答案 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>