2013-01-18 52 views
2

我必须在Android项目中使用线程。有时候,它正常运作,但有时候不会;它不会启动(不调用SendToServer()方法),或者它启动但在线程没有完成之前突然返回到另一个函数(返回更新;行)。Android线程有时无法启动

注:受影响的值大于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

您也可以使用由Android SDK提供的AsyncTask进行后台任务。 – JoxTraex

+0

'th.start(); th.join();' - 为什么要使用线程? – Howard

+0

因为某些原因,我无法使用AsyncTaks。我使用一个库生成代理类,它不支持AsyncTask,所以我必须使用线程 – essbek

回答

0

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

用的AsyncTask,你有一些方法,这在做你想要什么:

  • onPreExecute
  • doInBackground
  • onPostExecute

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

+0

感谢您的答复,但我不能使用AsyncTask,我必须使用线程,因为我的代理类generetor(它不支持异步) – essbek

+0

您使用哪种代理类生成器?你能给我们更多的细节吗? –

+0

WsClient ++演示版本 – essbek

1

其他人都在正确的的AsyncTask是前进的方向,而是直接问题,由于你正在经历是这样的(正因为如此,我会建议读了关于如何执行绪的作品):

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

你需要的是你的线程的回调,这是在AsyncTask的onPostExecute()方法中处理的。有一个关于如何使用他们,他们做的和一个很好的教程here

编辑: 我刚刚从以上评论不能使用Asynctasks,不够公平见过,但你仍然需要一个回调/事件从您的主题中解雇,返回任何结果