0

私のアプリケーションでは、ネットワークからのデータに応じて UI のテキストを更新する必要があります。そのためにAsyncTask、Android でバックグラウンドで作業を行うために を使用しています。私のコードは次のとおりです。

public class DefaultActivity extends Activity{

  TextView textView;
  public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    textView=(TextView)findViewById(R.id.textId);
    new networkFileAccess().execute("background","Progress","result");
  }

  private class networkFileAccess extends AsyncTask<String,String,String>{

    protected String doInBackground(String... background){
       return changeText();
    }

    private String changeText(){
     //Code to Access data from the Network.
     //Parsing the data.
     //Retrieving the boolean Value.
     if(booleanistrue){
      //Displaying some text on the UI.
      publishProgress("someTextOnUI");
      //Send request till we get get boolean value as false.
      changeText();
     }else{
       return "success";
     }
      return "";
    }

    protected void onProgressUpdate(String... progress){
      textView.setText("Wait background work is going on");
    }

    protected void onPostExecute(String result){
      if(result.equals("success")){
       //Code to finish the activity.
      }
    }
  }

}

上記のコードでは、ブール値が false になるまでバックグラウンド スレッドを実行できますが、UI でテキストが更新されません。onProgressUpdateメソッドを呼び出して () メソッドを使用して UI のテキストを更新できますか?何か提案がpublishProgressあれば教えてください。

4

3 に答える 3

10

このようにrunonUiTHREAD内にUiメソッドを配置します

runOnUiThread(new Runnable() {
public void run() {
    tv.setText("ABC");
}
 });
于 2012-05-04T14:08:17.927 に答える
7

AsyncTask では、onPostExecute() と onPreExecute() の両方が UI スレッドで実行されます。したがって、 onPostExecute() メソッドでテキストを変更できます。

または、スレッドで実行される doInBackground() メソッドで runOnUiThread を呼び出すこともできます。

runOnUiThread(new Runnable() {
    public void run() {
        // change text
    }
});

UIスレッドで実行するために実行可能に投稿します。

于 2012-05-04T14:07:54.167 に答える
4

短い答えは、はい、onProgressUpdate メソッドで UI 要素を更新できるということだと思います。OnProgressUpdate は実際には UI スレッド自体で呼び出されるため、特別なことを行う必要はありません。

onProgressUpdate が「バックグラウンド作業が進行中です」とハードコーディングされている場合、onProgressUpdate が機能していないことをどうやって知ることができますか?

また、ProgressDialog を使用して「バックグラウンド処理が進行中です」というメッセージをユーザーに表示しない理由はありますか? 実際に待機させたい場合は、通常、より直感的です。作業が行われていることを知らせるスピナーまたは進行状況バー (選択) が表示されます。また、アプリケーションが必要な処理を完了するまで、他の処理を実行できないようにする方法としても機能します。

于 2012-05-04T14:08:08.567 に答える