我正在尝试学习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);
}
[...]
}
答案 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();