Android:将参数传递给Thread

时间:2015-01-10 20:29:36

标签: java android multithreading methods parameters

我正在尝试学习Android编程,到目前为止一直都很好。现在我正在尝试学习线程,但我无法让我的代码工作。

我已经阅读了

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

我尝试使用两者来使我的代码工作,但我不知道如何这样做,因为它们都不符合我的需要,并且都使用相同的进度条示例。

我的布局中有3个按钮,我想要(慢慢地)向上或向下移动。我想用一个线程做这个,因为mainUI活动不应该在这样做时停止工作。 所以我的想法是开始一个新线程,我等待一段时间,而不是设置参数,我一次又一次地这样做。

我可能用全局变量来解决它,但我不想在这样的事情上使用这样的“廉价”技巧。

我的代码看起来像这样(大部分内容都是从双方复制的,因为我找不到一个线程的工作示例,其中参数被赋予方法)

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);
}

[...]
}

2 个答案:

答案 0 :(得分:2)

如果要将值传递给线程。我遵循的方法是:

创建一个扩展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或任何其他setter函数中传递任意数量的参数。

这是一种更简洁的方法,可以帮助您在将来更轻松,更干净地扩展代码。

代码语法可能有误。我只想分享这种方法。希望它会有所帮助。

答案 1 :(得分:1)

随时随地创建一个新的runnable:

    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();