2016-12-24 15 views
0

私はXamarinのAndroidアプリケーションを作成していますが、長時間実行しているネイティブ(Java)プロセスがあります。私はプロセス(stdout、stderr)の出力をキャプチャし、進行状況をUIを更新したいと思います。以下のコードは動作しません。今すぐUIスレッドをブロックします。Xamarin:長時間実行しているネイティブプロセスからUIを更新します。

UIスレッドをブロックせずにUIを更新する正しい方法は何ですか?

string[] myCmd = { "unix_cmd", "--args" }; 

process = Runtime.GetRuntime().Exec(myCmd); 
BufferedReader bufferedStdoutReader = new BufferedReader(new InputStreamReader(process.InputStream)); 
BufferedReader bufferedStderrReader = new BufferedReader(new InputStreamReader(process.ErrorStream)); 

logView.Text += "Stdout >>>>>>>>" + System.Environment.NewLine; 
var txt=""; 
txt = bufferedStdoutReader.ReadLine(); 
while (txt != null) 
{ 
    logView.Text += txt + System.Environment.NewLine; 
    txt = bufferedStdoutReader.ReadLine(); 
} 
logView.Text += "Stdout <<<<<<<<<" + System.Environment.NewLine + System.Environment.NewLine; 

logView.Text += "Stderr >>>>>>>>>>" + System.Environment.NewLine; 
txt = bufferedStderrReader.ReadLine(); 
while (txt != null) 
{ 
    logView.Text += txt + System.Environment.NewLine; 
    txt = bufferedStderrReader.ReadLine(); 
} 
logView.Text += "Stderr <<<<<<<<<<" + System.Environment.NewLine; 

process.WaitFor(); 

答えて

1

私は、プロセス(標準出力、標準エラー出力)の出力をキャプチャして、進捗状況とUIを更新したいです。

public Task<CapturOutputResult> CapturOutput(string) { 
    return Task.Run(delegate { 
     ... 
     return result; 
    }); 
} 

し、このようにタスクを実行します:

var result = await CapturOutput(string); 

私はあなたが例えばタスクへのプロセスの出力をキャプチャするためにあなたのコードをラップしようとすることができると思い

UIスレッドでUIを最後に更新します。

Application.SynchronizationContext.Post(_ => {/* invoked on UI thread */}, null); 
+2

Better Ac t.RunOnUiThread(()=> /*....*/); – XTL

+0

Activity.RunOnUiThreadはApplicationSynchronizationContext.Post呼び出しを置き換えますか? – Rick

+0

@Rick、はい、置き換えることができます。 –

関連する問題