我有一个返回结果的方法(返回一个整数),我的方法在一个Thread中执行,用于加载40 000个对象,我返回一个整数来计算加载的数字对象。我的问题是,如何用线程返回int?实际上,结果是直接返回的,等于0.
public int ajouter(params) throws DaoException, ConnectException {
final ProgressDialog dialog = ProgressDialog.show(mActivity, "Title",
"Message", true);
final Handler handler = new Handler() {
public void handleMessage(Message msg) {
dialog.dismiss();
}
};
Thread t = new Thread() {
public void run() {
try {
Str_Requete = "SELECT * FROM Mytable";
ResultSet result = ExecuteQuery(Str_Base, Str_Requete);
Index = addObjects(result);
handler.sendEmptyMessage(0);
} catch (SQLException e) {
e.printStackTrace();
}
}
};
t.start();
return Index;
}
当我在mainActivity中调用我的方法时:
int test = myObjs.ajouter(params);
test等于0,直接返回值... 我的约束是没有使用AsyncTask。
答案 0 :(得分:0)
如果您不想使用AsyncTask或ForkJoin,那么您可以实现一个接口,例如主要课程中的回调。
在你的例子中,你不要等到线程完成... thread.join
一种解决方案: 你的Thread是一个额外的类,带有一个构造函数来保存对调用类的引用。
public Interface callback
{
public int done();
}
public class main implements callback
{
...
CustomThread t = new CustomThread(this)
...
}
public class CustomThread extends Thread
{
private Callback cb;
public CustomThread(Callback cb)
{
this.cb=cb;
}
.
.
.
//when done
cb.done(int)
}
答案 1 :(得分:0)
使用Thread的重点不是在执行线程任务时阻塞调用代码。 Thread.start()立即返回,但与此同时,一个新线程与当前线程并行启动,该线程将执行run()方法中的代码。
因此,根据定义,没有从线程执行中返回值的事情。您必须以某种方式将执行任务的线程中的信号发送回您需要结果的线程。有很多种方法,有标准的Java等待/通知方法,还有Java并发库等。
由于这是Android,我假设您的调用代码在主线程上运行,因此使用Handler的功能可能是明智之举。事实上,你已经在做了 - 你有一个Handler在线程完成它的工作时关闭对话框 - 但由于某种原因你似乎期望在它开始之前就已经准备好了这个工作的结果。将现有的Handler扩展为一些使用计算值执行某些操作的代码并删除在另一个线程计算之前或同时返回变量值的代码是合理的。
我还强烈建议您学习一些并发教程,例如Oracle's concurrency lesson或Android Thread guidelines,以便真正了解后台正在发生的事情。在没有掌握概念的情况下编写并发代码迟早会失败,因为在并发性质中,多个事物同时发生,将以随机顺序完成等等。它可能不会经常失败,但你会发疯想知道为什么90%的时间突然失效的东西。这就是为什么诸如原子性,线程同步等主题对于理解是至关重要的。
编辑:启动工作线程的简单Android示例,执行一些工作,将事件发回主线程。
public class MyActivity extends Activity {
private Handler mHandler = new Handler();
...
private void doSomeWorkInBackground() {
new Thread() {
public void run() {
// do slow work, this may be blocking
mHandler.post(new Runnable() {
public void run() {
// this code will run on main thread,
// updating your UI or whatever you need.
// Hence, code here must NOT be blocking.
}
});
}
}.start();
// This code will be executed immediately on the main thread, and main thread will not be blocked
}
在此示例中,您也可以使用Activity.runOnUiThread(Runnable)
。
但请注意,AsyncTask
基本上以非常方便的方式包含此类功能,因此如果它适合您的目的,您应该考虑使用AsyncTask
。