0

基本的には、トピックに書いたことをどのように実行できるか疑問に思っています。AsyncTask に関する多くのチュートリアルを見てきましたが、機能させることができません。ユーザーがそこに入力したものを取得し、アプリケーションが検索して結果を表示するための URL クエリにする小さなフォーム (EditText) があります。

私の主な活動では、responseBody という文字列があります。次に、ユーザーが検索ボタンをクリックすると、検索機能に移動し、そこから asyncdata を開始する URL を使用して GrabUrl メソッドを呼び出し、そのプロセスが終了すると、onPostExecute メソッドは関数 activity.this.setResponseBody(content を使用します。 )。

これは、私のコードが最も重要な部分で単純化されたように見えるものです (私は思います)。

public class activity extends Activity {
   private String responseBody;
       @Override

   public void onCreate(Bundle savedInstanceState) {

      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);
      initControls();
   }

   public void initControls() {

      fieldSearch = (EditText) findViewById(R.id.EditText01);
      buttonSearch = (Button)findViewById(R.id.Button01);
      buttonSearch.setOnClickListener(new Button.OnClickListener() { public void onClick (View v){ search();
    }});

  }

    public void grabURL(String url) {
    new GrabURL().execute(url);
}

    private class GrabURL extends AsyncTask<String, Void, String> {
       private final HttpClient client = new DefaultHttpClient();
       private String content;
       private boolean error = false;
       private ProgressDialog dialog = new ProgressDialog(activity.this);

       protected void onPreExecute() {
        dialog.setMessage("Getting your data... Please wait...");
        dialog.show();
       }

   protected String doInBackground(String... urls) {
      try {
         HttpGet httpget = new HttpGet(urls[0]);
     ResponseHandler<String> responseHandler = new BasicResponseHandler();
     content = client.execute(httpget, responseHandler);
      } catch (ClientProtocolException e) {
     error = true;
     cancel(true);
      } catch (IOException e) {
     error = true;
     cancel(true);
      }

      return content;
   }

   protected void onPostExecute(String content) {
      dialog.dismiss();
      if (error) {
             Toast toast = Toast.makeText(activity.this, getString(R.string.offline), Toast.LENGTH_LONG);
         toast.setGravity(Gravity.TOP, 0, 75);
         toast.show();
      } else {
     activity.this.setResponseBody(content);
      }
    }
     }

        public void search() {

          String query = fieldSearch.getText().toString();

          String url = "http://example.com/example.php?query=" + query; //this is just an example url, I have a "real" url in my application but for privacy reasons I've replaced it 

          grabURL(url); // the method that will start the asynctask

          processData(responseBody); // process the responseBody and display stuff on the ui-thread with the data that I would like to get from the asyntask but doesn't obviously

         }
4

1 に答える 1

0

この回答は無視してください。投稿する前にコメントを読んでいませんでしたが、参考のために元のコンテンツをここに残しておきます。


setResponseBody(String content) は runOnUiThread() を呼び出す必要があります。

public void setResponseBody(String content) {
    runOnUiThread(new Runnable() {
        public void run() {
            //set the content here
        }
    }
}

Android (および他の多くの GUI ツールキット (QT、WinForms、iirc)) では、ビューを作成したスレッド (UI スレッド) でのみビューを変更できます。runOnUiThread() を呼び出すと、提供されたランナブルがこの UI スレッドで実行されます。

于 2010-03-17T09:08:39.127 に答える