2

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

2 回答 2

1

其他人是正确的,因为 AsyncTask 是前进的方向,但是由于您所遇到的直接问题是这样的(因此,我建议阅读线程的工作原理):

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

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

编辑: 我刚刚从上面的评论中看到你不能使用 Asynctasks,这很公平,但你仍然需要从你的 Thread 触发一个回调/事件来返回任何结果

于 2013-01-18T09:05:02.337 回答
0

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

使用 AsyncTask,您有一些方法可以完全按照您的意愿进行操作:

  • 预执行
  • 做背景
  • 后执行

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

于 2013-01-18T09:01:32.717 回答