2

Androidプロジェクトでスレッドを使用する必要があります。場合によっては、正しく機能することもありますが、機能しないこともあります。起動しない(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スレッド(通常、コードの大部分が存在する場所)は続行されます。したがって、UIスレッドはすぐに次の行に移動するため、コードはでスレッドを起動し、定義によりすぐに実行さますSendToServer()return updated

必要なのはonPostExecute()、AsyncTaskのメソッドで処理されるスレッドからのコールバックです。それらの使用方法とそれらがここで何をするかについての良いチュートリアルがあります

編集: 上記のコメントから、Asynctasksは十分に公平に使用できないことがわかりましたが、結果を返すには、スレッドから発生するコールバック/イベントが必要です。

于 2013-01-18T09:05:02.337 に答える
0

スレッドと変数(更新および影響を受ける)を使用する代わりに、AsyncTasksを使用できます。http://developer.android.com/reference/android/os/AsyncTask.htmlを参照してください

AsyncTaskを使用すると、必要なことを正確に実行するいくつかのメソッドがあります。

  • onPreExecute
  • doInBackground
  • onPostExecute

したがって、実行できることは、onPreExecuteで状態を確認してから、doInBackgroundでSendToServerを実行し、onPostExecuteで必要な処理を実行することです。

于 2013-01-18T09:01:32.717 に答える