Android:传递参数给Thread
Android: Passing parameter to Thread
我正在努力学习 Android 编程,到目前为止一切顺利。现在我正在尝试学习有关线程的一些知识,但我无法让我的代码正常工作。
我已经阅读了
http://developer.android.com/guide/faq/commontasks.html#threading
http://www.vogella.com/tutorials/AndroidBackgroundProcessing/article.html#concurrency_handler
我尝试同时使用这两者来使我的代码正常工作,但我不知道该怎么做,因为 none 它们符合我的需要并且都使用相同的进度条示例。
我的布局中有 3 个按钮,我想向上或向下移动(缓慢)。我想用一个线程来做到这一点,因为 mainUI activity 不应该在这样做时停止工作。
所以我的想法是启动一个新线程,在那里我等待一段时间然后设置参数,然后我一次又一次地这样做。
我可能可以用全局变量来解决它,但我不想对这样的事情使用这样的 "cheap" 技巧。
我的代码看起来像这样(大部分代码是从两侧复制的,因为我找不到为方法提供参数的线程的工作示例)
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);
}
[...]
}
随时随地创建一个新的可运行对象:
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();
如果你想给线程传值。我遵循的方法是:
创建一个新的 class 来扩展 runnable
class。
public interface myRunnable extends Runnable {
public void setParams(int param1, int param2);
}
现在实施这个 class
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
class 的新 class 并添加您现在想要或将来可能需要的任何功能。在 constructor
或任何其他 setter 函数中传递任意数量的参数。
这是一种更简洁的方法,将帮助您在未来更轻松、更干净地扩展代码。
代码语法可能有误。我只是想分享这个方法。希望对你有帮助。
我正在努力学习 Android 编程,到目前为止一切顺利。现在我正在尝试学习有关线程的一些知识,但我无法让我的代码正常工作。
我已经阅读了
http://developer.android.com/guide/faq/commontasks.html#threading http://www.vogella.com/tutorials/AndroidBackgroundProcessing/article.html#concurrency_handler
我尝试同时使用这两者来使我的代码正常工作,但我不知道该怎么做,因为 none 它们符合我的需要并且都使用相同的进度条示例。
我的布局中有 3 个按钮,我想向上或向下移动(缓慢)。我想用一个线程来做到这一点,因为 mainUI activity 不应该在这样做时停止工作。 所以我的想法是启动一个新线程,在那里我等待一段时间然后设置参数,然后我一次又一次地这样做。
我可能可以用全局变量来解决它,但我不想对这样的事情使用这样的 "cheap" 技巧。
我的代码看起来像这样(大部分代码是从两侧复制的,因为我找不到为方法提供参数的线程的工作示例)
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);
}
[...]
}
随时随地创建一个新的可运行对象:
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();
如果你想给线程传值。我遵循的方法是:
创建一个新的 class 来扩展 runnable
class。
public interface myRunnable extends Runnable {
public void setParams(int param1, int param2);
}
现在实施这个 class
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
class 的新 class 并添加您现在想要或将来可能需要的任何功能。在 constructor
或任何其他 setter 函数中传递任意数量的参数。
这是一种更简洁的方法,将帮助您在未来更轻松、更干净地扩展代码。
代码语法可能有误。我只是想分享这个方法。希望对你有帮助。