-2

Webページを文字列として読み取ろうとすると、これが私のコードです:

    public class ReadWebPage extends Activity {
private EditText url_text;
private TextView textView;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    url_text = (EditText) findViewById(R.id.address);
    textView = (TextView) findViewById(R.id.tv);
}
public void myButtonClickHandler(View view) {
    switch (view.getId()) {
    case R.id.ReadWebPage:
        try {
            if (!url_text.getText().toString().trim().equalsIgnoreCase("")) {
                textView.setText("");
                HttpClient client = new DefaultHttpClient();
                HttpGet request = new HttpGet(url_text.getText().toString());
                // Get the response
                ResponseHandler<String> responseHandler = new BasicResponseHandler();
                String response_str = client.execute(request,
                        responseHandler);
                textView.setText(response_str);
            } else {
                Toast.makeText(getApplicationContext(),
                        "URL String empty.", Toast.LENGTH_LONG).show();
            }
        } catch (Exception e) {
            System.out.println("Some error occured.");
            textView.setText(e.getMessage());
        }
        break;
    }
}
    }

上記のように、そのコードを使用してコードを表示し、Webページを文字列として読み取ろうとしていますが、そのエラーが表示されています。

  03-03 22:37:45.088: I/System.out(1233): Some error occured.
   03-03 22:37:45.088: W/System.err(1233): android.os.NetworkOnMainThreadException
  03-03 22:37:45.138: W/System.err(1233):   at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)    org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)
 -03 22:37:45.148: W/System.err(1233):  at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
  03-03 22:37:45.158: W/System.err(1233):   at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
4

1 に答える 1

0

Android は、UI スレッドでネットワーク操作を行うべきではないと言っています。スレッドをブロックしたくありませんが、それには正当な理由があります。

代わりにAsyncTaskを使用してみてください。HTTP 要求コードをdoInBackground()メソッドに入れ、メソッドで を更新しTextViewますonPostExecute()doInBackground()メソッドから UI スレッドにアクセスすることはできません。

これは本当に基本的な例です:

class MyAsyncTask extends AsyncTask<String, String, String> 
{
    private TextView textView;

    public MyAsyncTask(TextView textView)
    {
        this.textView = textView;
    }

    protected Long doInBackground(String... params) 
    {
        String url = params[0];
        // your HTTP request code goes here
        return response;
    }

    protected void onPostExecute(String result) 
    {
        textView.setText(result);
    }
}

次のようにクラスを使用します。

new MyAsyncTask(myTextView).execute(myUrl);
于 2013-03-03T17:19:02.963 に答える