2015-01-10 4 views
2

Я пытаюсь научиться программированию на Android, и пока все хорошо. Прямо сейчас я пытаюсь узнать что-то о потоках, но я не могу заставить свой код работать.Android: Передача параметра в Thread

я уже читал

http://developer.android.com/guide/faq/commontasks.html#threading http://www.vogella.com/tutorials/AndroidBackgroundProcessing/article.html#concurrency_handler

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

У меня есть 3 кнопки в моем макете, которые я хочу перемещать (медленно) вверх или вниз. Я хотел сделать это с потоком, так как mainUI-активность не должна перестать работать при этом. Итак, моя идея состояла в том, чтобы начать новый поток, где я жду немного времени и задаю параметры, и я делаю это снова и снова.

Возможно, я мог бы решить эту проблему с помощью глобальных переменных, но я не хочу использовать такой «дешевый» трюк для чего-то подобного.

Мой код выглядит следующим образом (Большинство из них скопировано с двух сторон, так как я не могу найти рабочий пример для потока, в котором параметры приведены в Methods)

public class MainActivity extends Activity { 

// Need handler for callbacks to the UI thread 
final Handler mHandler = new Handler(); 

// Create runnable for posting 
final Runnable mUpdateResults = new Runnable() { 
    public void run() { 
     updateResultsInUi(); 
    } 
}; 

protected void moveMenu(int direction, final int time) { 

    // Fire off a thread to do some work that we shouldn't do directly in the UI thread 
    Thread t = new Thread() { 
     public void run() { 
      for (int i = 0; i < 10; i++) { 
       doSomethingExpensive(time); 
       mHandler.post(mUpdateResults); // <--- Here im looking for a way to give i to the updateResultsInUi() Method 
      } 
     } 
    }; 
    t.start(); 
} 

private void updateResultsInUi(int i) { 

    // Back in the UI thread -- update our UI elements based on the data in mResults 
    ScrollView topScrollView = (ScrollView) findViewById(R.id.scrollView1); 
    LinearLayout botLinearLayout = (LinearLayout) findViewById(R.id.LinearLayoutButton); 

    LinearLayout.LayoutParams paramsScrollView = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT,0,90+i); 
    LinearLayout.LayoutParams paramsLinearLayout = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT,0,10-i); 
    topScrollView.setLayoutParams(paramsScrollView); 
    botLinearLayout.setLayoutParams(paramsLinearLayout); 
} 

// Simulating something timeconsuming 
private void doSomethingExpensive(int time) { 
    try { 
    Thread.sleep(time); 
    } catch (InterruptedException e) { 
    e.printStackTrace(); 
    } 
} 

public void button_click_del(View v) 
{ 
    [...] 
    moveMenu(direction, time); 
} 

[...] 
} 

ответ

1

Создать новый работоспособный на ходу :

Thread t = new Thread() { 
     public void run() { 
      for (int i = 0; i < 10; i++) { 
       doSomethingExpensive(time); 
       final int finalI = i; 
       mHandler.post(new Runnable() { 
        public void run() { 
         updateResultsInUi(finalI); 
        } 
       }); 
      } 
     } 
    }; 
    t.start(); 
1

Если вы хотите передать значения в поток. Следующим подходом является:

Создайте новый класс, который расширит класс runnable.

public interface myRunnable extends Runnable { 

    public void setParams(int param1, int param2); 
} 

в настоящее время реализации этого класса

public class ImplementMyRunnable implements myRunnable{ 
int param1; 
int param2; 
    public void setParams(int param1, int param2){ 
    this.param1 = param1; 
    this.param2 = param2; 
    } 

public void run(){ 
    //your code here and use as many parameters you want 
} 
} 

сейчас в вашей функции moveMenu

protected void moveMenu(int direction, final int time) { 
    ImplementMyRunnable object1 = new ImplementMyRunnable(); 
    object1.setParams(1,12); 
    Thread myThread = new Thread(object1); 
    myThread.start(); 
} 

в основном то, что я хотел бы отметить здесь. Создайте новый класс, который расширяет класс Runnable и добавляет все, что вам нужно сейчас, или вы можете потребовать его в будущем. Передайте столько параметров, сколько хотите, в constructor или в любой другой функции сеттера.

Это более аккуратный подход и поможет вам более легко и чисто расширить ваш код в будущем.

Синтаксис кода может быть неправильным. Я только хотел поделиться этим подходом. Надеюсь, это поможет.

+1

с некоторыми изменениями Я сделал это над всеми моими Runnables. Спасибо за код – SolidSnake

Смежные вопросы