1

奇妙な問題が発生しています...私のアプリケーションは、別のスレッドでいくつかのWebサービス呼び出しを実行することを目的としています。Webサービスの呼び出しが終了すると、ユーザーは別のアクティビティに移動します。ユーザーがホームボタンを押すか、現在のアクティビティを終了する場合、Webサービス呼び出しスレッドがまだ実行中であれば、Webサービスを終了する必要があります。したがって、スレッド終了メソッドをOnPause状態にします。

スレッド内で実行されているメソッドブロックは次のとおりです。

private Thread _webserviceThread;

void WebserviceCallThread(){
    WebRestult result= WebserviceCall();
    if(!result.containsError()){
         RunOnUIThread(delegate{
             transitionToActivityXYZ();
         });
    }
}

void RunThreadAction(){
    _webserviceThread = new Thread(new ThreadStart(WebserviceCallThread));
    _webserviceThread.Start();
}


protected override void OnPause(){
    if(_webserviceThread != null && _webserviceThread.IsAlive){
        _webserviceThread.Abort();
    }

}

Webサービスの呼び出しが完了し、別のページへの移行を開始すると、OnPause状態になります。ただし、奇妙な場合には、アクティビティ遷移がメソッドの最後の行であっても、スレッドがOnPause状態で終了していないと見なされることがあります。

誰かが以前にこの問題に遭遇したことがありますか?もしそうなら、どのようにしてこの問題を解決しましたか?

ありがとう!

4

2 に答える 2

1

私はいつもこういうことに使っAsyncTaskています。明示的なスレッド処理を抽象化し、ここで必要なすべてを実行するためのフックを提供するだけではありません。unit of workまた、他のから使用できるを表すための優れた方法でもありactivitiesます。

この投稿の途中に簡単な例がありますが、非常に便利な汎用パラメーターを使用していません。

于 2013-02-13T18:09:50.720 に答える
1

タスク並列ライブラリを使用してみませんか。これは標準の.NETであり、AsyncTaskを使用すると、数秒未満のタスクにのみ推奨されます。ドキュメントを参照してください

AsyncTasksは、理想的には短い操作(最大で数秒)に使用する必要があります。スレッドを長期間実行し続ける必要がある場合は、java.util.concurrentが提供するさまざまなAPIを使用することを強くお勧めします。

以下は、タスク並列ライブラリの使用方法の例です。ここから抜粋しました。

private void loginWithTaskLibrary()
{
    _progressDialog.Show();

    Task.Factory
        .StartNew(() =>
            _loginService.Login("greg")
        )
        .ContinueWith(task =>
            RunOnUiThread(() =>
                onSuccessfulLogin()
            )
        );
}
于 2013-02-17T22:37:39.923 に答える