我必须在 Android 项目中使用 Thread。有时,它可以正常工作,但有时却不能;它不启动(不调用 SendToServer() 方法)或它启动但在线程未完成之前突然返回到另一个函数(返回更新;行)。
注意:影响值大于0,给出条件,进入if语句。
这是我的代码示例;
public static Boolean MyUpdateFunction(MyObject myobject){
Boolean updated=false;
//Code for updating local database
int affected= SqliteDb.update(....);
if(affected>0)
{
//Send updated data to server
//For this I must use Thread(I can't use AsyncThread)
updated=true;
SendToServer();
}
return updated;
}
public static void SendToServer()
{
try{
;
Thread th=new Thread(new Runnable() {
public void run() {
try {
//Create data and send it to server
//.......
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
th.start();
th.join();
}
catch(SQLException e)
{
Toast.makeText(myContext,"ERROR: "+e.getMessage(), Toast.LENGTH_LONG).show();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
最佳答案
其他人是正确的,因为 AsyncTask 是前进的方向,但由于您遇到的问题而导致的直接问题是这个(因此,我建议阅读线程的工作原理):
当您启动线程时,它会开始一个新进程。 UI 线程(通常是大部分代码所在的位置)继续。因此,您的代码将使用SendToServer()
触发线程,然后根据定义将立即返回更新
,因为UI 线程会立即转到下一行。
您需要的是来自 Thread 的回调,它在 AsyncTask 的 onPostExecute()
方法中处理。关于如何使用它们以及它们的作用有一个很好的教程 here
编辑: 我刚刚从上面的评论中看到你不能使用 Asynctasks,这很公平,但你仍然需要从你的线程中触发一个回调/事件来返回任何结果
关于Android线程有时不启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14395353/