Android线程有时无法启动

时间:2013-01-18 08:55:33

标签: android multithreading thread-synchronization

我必须在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();
}
}

2 个答案:

答案 0 :(得分:1)

其他人都是正确的,因为AsyncTask是前进的方向,但由于你正在经历的直接问题是这个(因此,我建议阅读线程如何工作):

启动线程时,它会开始一个新进程。 UI线程(通常是您的大部分代码所在的位置)继续。因此,您的代码使用SendToServer()触发线程,然后根据定义将立即return updated,因为UI线程会立即转到下一行。

你需要的是一个来自你的线程的回调,它在AsyncTask的onPostExecute()方法中处理。有一个关于如何使用它们以及它们做什么here

的好教程

修改 我刚才从上面的评论中看到你不能使用Asynctasks,但是你仍然需要从你的线程中触发一个回调/事件来返回任何结果

答案 1 :(得分:0)

您可以使用AsyncTasks而不是使用线程和变量(已更新和受影响):请参阅:http://developer.android.com/reference/android/os/AsyncTask.html

使用AsyncTask,您可以使用一些方法完成您想要的操作:

  • onPreExecute
  • doInBackground
  • onPostExecute

所以,你可以做的是检查onPreExecute中的条件,然后在doInBackground中执行SendToServer,并在onPostExecute执行你需要的操作。