2013-06-23 4 views
1

Я пытаюсь отправить String [] в поток во внутреннем классе другого класса (если это имеет смысл). Затем я хочу выполнить некоторую работу со строкой [], а затем вернуть ее обратно в пользовательский интерфейс. Но я не уверен, как это сделать? Я также использую сообщения, чтобы я мог контролировать то, что будет выведено в пользовательском интерфейсе.Confused on Handlers в Android

Heres моего MainActivity:

public class MainActivity extends Activity implements OnClickListener { 
EditText cl; 
TextView info; 
Button enter; 
Button line; 
Button arc; 
Line callLine = new DrawingUtils.Line(); 
Enter callEnter = new DrawingUtils.Enter(); 
Arc callArc = new DrawingUtils.Arc(); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    info = (TextView) findViewById(R.id.info); 
    enter = (Button) findViewById(R.id.enter); 
    line = (Button) findViewById(R.id.line); 
    arc = (Button) findViewById(R.id.arc); 
    cl = (EditText) findViewById(R.id.editText1); 

    Handler uiHandler = new Handler() { 
     public void handleMessage(Message msg) { 
      switch (msg.what) { 

      } 
     } 
    }; 

} 

@Override 
public void onClick(View v) { 
    switch (v.getId()) { 
    case R.id.enter: 
     String in = cl.getText().toString(); 
     String[] Input = in.split(","); 
     // I would like to send Input[] to the line Thread in DrawingUtils 
     callEnter.start(); 
     break; 
    case R.id.line: 
     callLine.start(); 
     break; 
    case R.id.arc: 
     callArc.start(); 
     break; 

    } 

}; 

} 

Heres другой класс, который имеет в своем классе с Thread:

public class DrawingUtils { 

// Thread classes for buttons 
public static class Line extends Thread { 
    Thread line = new Thread() { 
     public void run() { 
      Looper.prepare(); 
      Handler lineHandler = new Handler() { 
       public void handleMessage(Message msg) { 
        // How to get Input from Enter button to use in thread 
       } 
      }; 
      Looper.loop(); 
      // Then I need to do some work 
      // Then Send the worked data back to the uiHandler in 
      // oncreate(). 
     } 
    }; 
} 

я использовал обработчик cuase они походили вот что будет работать для моего кода , когда кто-то нажимает кнопку «Линия», он устанавливает текстовое сообщение (INPUT POINT1), тогда поток будет ждать, и когда пользователь вводит x, y, z в edittext и нажимает Enter, ввод будет помещен в строку, затем разделен запятой и помещается в строковый массив, который будет обрабатывать поток строк, а затем в конце Enters code notifyAll() вызывается, чтобы продолжить поток строк и запросить следующий ввод. в конце линейной нити он будет обращен обратно к потоку пользовательского интерфейса

+0

если вы используете OpenGL, пожалуйста, сообщите нам об этом! Я думаю, что AsyncTask будет работать нормально, но кто-то квалифицированный в opengl может дать вам конкретные советы! –

+0

Да, плохо использовать opengl. Ввод будет х, y, z coords. Пример, когда вы нажимаете строку, будет запрашивать точку 1, а затем точку два, затем она будет рисовать линию. –

ответ

3

Почему вы хотите использовать обработчики? Я бы использовал AsyncTask с параметрами, они идеально подходят в большинстве случаев, как и ваш. Посмотрите на: http://developer.android.com/reference/android/os/AsyncTask.html

Я хотел бы попробовать это (MyAsyncTaskподкласс от класса активность):

private class MyAsyncTask extends AsyncTask<String[], Void, Boolean> { 
    //declare here local variables 
    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 

     //prepare your local variables for the computation 
    } 

@Override 
protected Boolean doInBackground(String[]... arg0) { 

    String[] myStringArray = arg0[0]; 
    // make your manipulation of myStringArray 

    return null; // return the result and set your local variable 
} 

    @Override 
    protected void onPostExecute(Boolean result) { 
     super.onPostExecute(result); 

     //update ui using result and/or local variable 
    } 
} 

От события щелчка вы называете что-то вроде этого:

String[] strings = {"1", "2", "3"}; 
new MyAsyncTask().execute(strings); 

Я хочу чтобы предупредить вас о вашем коде:

@Override 
public void onClick(View v) { 
    switch (v.getId()) { 
    case R.id.enter: 
     String in = cl.getText().toString(); 
     String[] Input = in.split(","); 
     // I would like to send Input[] to the line Thread in DrawingUtils 
     callEnter.start(); 
     break; 
    case R.id.line: 
     callLine.start(); 
     break; 
    case R.id.arc: 
     callArc.start(); 
     break; 
    } 
}; 

переменная Input инициализируется только в первом случае, если сазе выбрать R.id.line или R.id.arc вы в беде ...

+0

ах, вы говорите, что инициализация переменной Input всегда будет сделана щелчком первой кнопки, нормально. Во всяком случае, когда вы завершаете сбор данных из щелчков ваших кнопок, просто вызывайте новый MyAsyncTask(). Execute (string); и он будет выполнять вычисления и обновлять пользовательский интерфейс. Не знаю, есть ли у opengl-чертежа проблемы с задачей async, но дайте ему попробовать ... –

+0

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

+1

Не забывайте, что AsyncTask не может обновить элемент пользовательского интерфейса в 'doInBackground()'. Используйте либо 'onPostExecute()', либо 'onProgressChanged()' – Rob013