3

Web サイトからデータを取得し、解析して Android アプリケーションに入れようとしています。残念ながら、私はデータを解析することさえできません。次の行以降、コードは実行されません。

HttpResponse response = httpclient.execute(httpget);

その結果、メッセージ = 333 になります。Eclipse デバッガーを使用してステップ オーバーすると、その行が実行されることがわかります。次に、応答変数 (=200) を読み取ることができますが、その後の行は実行されません。関数内の 444 またはその他のコードには到達しません。Android マニフェストでインターネット許可を宣言しました。

コード:

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import org.apache.http.HttpResponse;
import org.apache.http.StatusLine;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import android.os.AsyncTask;
import android.widget.TextView;

public class MainActivity extends Activity {

TextView message;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    message = (TextView)findViewById(R.id.message);

    message.setText("111");
    //new getinternetData .execute("");

}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}


@Override
protected void onStart(){
    super.onStart();
    new getinternetData().execute("");
    //message.setText("OnStart");
}

private class getinternetData extends AsyncTask<String, Void, String>{

    @Override
    protected String doInBackground(String... params) {
        HttpClient httpclient = new DefaultHttpClient();
        HttpGet httpget = new HttpGet("http://www.google.com");
        try{
            message.setText("333");
            HttpResponse response = httpclient.execute(httpget);
            message.setText("444");
            StatusLine statusLine = response.getStatusLine();
            int statusCode = statusLine.getStatusCode();
            if(statusCode == 200){
                message.setText("Could connect");
            }else
                message.setText("Couldn't connect");
        }catch(Exception e){
            message.setText(e.toString());
        }

        message.setText("555");
        return null;
    }

    @Override
    protected void onPostExecute(String result) {
        //message.setText("Postsequence");
    }   
}

何が間違っているのかわかりません。
AsyncTask を適切に使用していないためですか?
それとも、httpclient.execute を適切に使用していないのでしょうか?

編集: メッセージを log.d に変更したおかげで、接続できることがわかりました。障害は、画面の更新などにあります。学ぶことがたくさんあります。

これが私の変更されたコード部分です:

    private static final String TAG = "MainActivity";

    @Override
    protected String doInBackground(String... params) {
        HttpClient httpclient = new DefaultHttpClient();
        HttpGet httpget = new HttpGet("http://www.google.com");
        try{
            //message.setText("333");
            Log.d(TAG, "Before httpResponse");
            HttpResponse response = httpclient.execute(httpget);
            Log.d(TAG, "After httpResponse");
            StatusLine statusLine = response.getStatusLine();
            int statusCode = statusLine.getStatusCode();
            Log.d(TAG, "after statusCode, code= " +statusCode);
            if(statusCode == 200){
                Log.d(TAG, "Could connect");
            }else{
                Log.d(TAG, "Couldn't connect");
            }
        }catch(Exception e){
            Log.d(TAG, e.toString());
        }
        Log.d(TAG, "Exit do in background");
        return null;

Logcat の結果:

 : D/MainActivity(22323): Before httpResponse
 bunch of code
 : D/MainActivity(22323): After httpResponse
 : D/MainActivity(22323): after statusCode, code= 200
 : D/MainActivity(22323): Could connect
 : D/MainActivity(22323): Exit do in background
4

2 に答える 2

1

あなたが抱えている問題の 1 つは、バックグラウンド スレッドから画面 (メッセージ) を更新しようとしていることです。AsyncTask.publishProgress(...) を使用して、メイン スレッドがその onProgressUpdate() メソッドで GUI を更新できるようにします。

また、画面を更新するのではなく、ログ メッセージ Log.d(TAG, "You Are Here.); を作成し、logcat で監視することを検討してください。

これは HTTP の問題には対応していませんが、最初にこれを解決して、バックグラウンド スレッドで画面を変更することによってハングが発生していないことを確認してください。

于 2013-03-20T22:48:51.657 に答える
0

Dale Wilson が言ったように、doInBackground メソッドで UI を更新することはできません。onPreExecute および onPostExecute メソッドを優先します。

次のように、doInBackground の結果でメッセージ TextView を更新することもできます。

private class getinternetData extends AsyncTask<String, Void, String>{

    @Override
    protected String doInBackground(String... params) {
        HttpClient httpclient = new DefaultHttpClient();
        HttpGet httpget = new HttpGet("http://www.google.com");
        try{
            //message.setText("333");
            HttpResponse response = httpclient.execute(httpget);
            //message.setText("444");
            StatusLine statusLine = response.getStatusLine();
            int statusCode = statusLine.getStatusCode();
            if(statusCode == 200){
                return "Could connect";
            }else
                return "Couldn't connect";
        }catch(Exception e){
            return e.toString();
        }

        return null;
    }

    @Override
    protected void onPostExecute(String result) {
        if (result != null)
            message.setText(result);
    }   
}
于 2013-03-20T23:08:04.017 に答える