Я преобразовываю некоторые данные в асинхронную задачу. Я использую androdidplot, так как хочу видеть точки, которые я генерирую в коде, но мне трудно, так как я их не вижу.

Я проверил вопрос по этой ссылке: Доступ к элементам пользовательского интерфейса из Asynctask и он указывает на объявление XYPlot и LineAndPointFormatter как членов класса и инициализацию их в onCreate. После этого я просто рисую из onPostExecute. Я проверил через ЖУРНАЛ, генерируются ли данные и нет ли проблем. Может ли кто-нибудь помочь мне или дать мне подсказку, пожалуйста?

Вот мой код:

public class MainActivity extends ActionBarActivity {

    Button startStopButton;
    boolean started = false;
    TextView tv1; //not ussed so far

    GenerateSamples samplesTask;

    XYPlot plot;
    ArrayList Vector = new ArrayList();
    public int DataY;

    XYSeries series ;
    LineAndPointFormatter seriesFormat ;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        startStopButton = (Button) this.findViewById(R.id.StartStopButton);
        tv1 = (TextView) findViewById(R.id.tv1); //Not used so far

        plot = (XYPlot) findViewById(R.id.Grafica);

        plot.setDomainStep(XYStepMode.INCREMENT_BY_VAL,20); //x
        plot.setRangeStep(XYStepMode.INCREMENT_BY_VAL, 5000);   //y

        plot.getGraphWidget().getGridBackgroundPaint().setColor(Color.rgb(255, 255, 255));
        plot.getGraphWidget().getDomainGridLinePaint().setColor(Color.rgb(255, 0, 0) );
        plot.getGraphWidget().getRangeGridLinePaint().setColor(Color.rgb(255, 0, 0));
        plot.setRangeBoundaries(-20000, 20000, BoundaryMode.FIXED); //y
        plot.setDomainBoundaries(0, 100, BoundaryMode.FIXED); //x

           series    = new SimpleXYSeries(  Vector, SimpleXYSeries.ArrayFormat.Y_VALS_ONLY, "signal") ;
        seriesFormat = new LineAndPointFormatter(Color.rgb (127, 255, 0 ), 0x000000, 0x000000,null ) ;


        /** Listener when the button is clicked. */
        startStopButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                if (started) {
                    started = false;
                    startStopButton.setText("Start");
                    samplesTask.cancel(true);
                } else {
                    started = true;
                    startStopButton.setText("Stop");
                    samplesTask = new GenerateSamples();
                    samplesTask.execute();
                }
            }
        });
    }

    /**
     * Called when the button is pressed
     */
    public class GenerateSamples extends AsyncTask {

        public int[] generateRandom() {

            int[]random = new int [20] ;
            Random rand = new Random();

            for (int i = 0; i <= random.length-1; i++)
               //random[i]= rand.nextInt(32761);
                random[i] = rand.nextInt(32761 + 1 + 32762) - 32761 ;
                //random[i] = rand.nextInt(30 + 1 +30) - 30 ;

            return random;
        }

        @Override
        protected Void doInBackground(Void... arg0) {
            //It returns a boolean. It needs a void = nothing to do with the task.
            //It can get data from a method into the class without the need of getting it from the argument
            //of the asynctask class.

            int[] point ;
            point = generateRandom();

            for (int i = 0; i <= point.length-1; i++) {
                point[i] = point[i]+5;
                longTask();

                publishProgress(point[i]);


                if( isCancelled() )
                   break;
            }
           return null;
        }

        @Override
        protected void onProgressUpdate(Integer... values) {
            //It returns a void = it returns nothing. It needs an integer to do the task ;
           DataY=  values[0];
            Vector.add(DataY);
            Log.d("Samples log", "samples: " + DataY );

        }

        @Override
        protected void onPostExecute(Void result) {

            plot.addSeries(series,seriesFormat) ;

            Toast.makeText(MainActivity.this, "Finished Task!",
                        Toast.LENGTH_SHORT).show();
        }

        @Override
        protected void onCancelled() {
            Toast.makeText(MainActivity.this, "Cancelled Task!",
                    Toast.LENGTH_SHORT).show();
        }
    }

    private void longTask() {
        try {
            Thread.sleep(100); //100 milliseconds
        } catch (InterruptedException e) {
        }
    }


}

Вот xml:




    
    


    


    

Ответы (1)

Внутри OnPostExecute попробуйте следующее:

plot.addSeries(series,seriesFormat) 
plot.redraw()

2022 WebDevInsider