0

現在、いくつかの Twitter 情報を DL しようとしていますが、何らかの理由で、使用しているコードがデータを返しません。

エクスプローラーで URL を手動で使用すると、データを取得できます。しかし、Androidにそれを実行させようとすると、例外が発生します。

データを取得しようとする 2 つの方法を見つけました。1枚目はご覧の通り。2 つ目は、コメントの上の 3 行をコメントアウトし、他の行のコメントを外します。

文字列を解析するために、後で単純な JSON を使用します。

私の問題を十分に説明できたことを願っています。どんなコメントでも大歓迎です。

import java.io.InputStream;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;

public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    String searchUrl = "http://search.twitter.com/search.json?q=@aplusk&rpp=100&page=1";


    HttpClient client = new  DefaultHttpClient();
    HttpGet get = new HttpGet(searchUrl);

    ResponseHandler<String> responseHandler = new BasicResponseHandler();

    String responseBody = null;
    Log.d("log", "test"+responseBody);
    try{
        responseBody = client.execute(get, responseHandler);
        HttpResponse response = client.execute(get);
        responseBody =  response.toString();


//          HttpResponse response = client.execute(get);
//          InputStream inputStream = response.getEntity().getContent();
//          responseBody = inputStream.toString();

        Log.d("log", "test2"+responseBody);

    }catch(Exception ex) {
        Log.d("log", "nope");
        ex.printStackTrace();
    }

}

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


}
4

1 に答える 1

1

あなたの例外が何であるかはわかりませんが、最初の問題はおそらく、メイン スレッドでネットワーク アクティビティを実行していることです。新しいスレッドをスピンアップするか、Async Taskを使用する必要があります。

2 番目の問題は、応答を文字列に不適切に変換していることです。実際のコンテンツ文字列を取得するには、InputStream を反復処理する必要があります。これは私の好みの方法です。

また、<uses-permission android:name="android.permission.INTERNET" />あなたのAndroidManifest.xmlファイルにあることを確認してください。

これを試してください:

import java.io.InputStream;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;

public class MainActivity extends Activity {

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

        (new Thread(new Runnable() {

            @Override
            public void run() {
                String searchUrl = "http://search.twitter.com/search.json?q=@aplusk&rpp=100&page=1";
                HttpClient client = new DefaultHttpClient();
                HttpGet get = new HttpGet(searchUrl);

                String responseBody = null;
                Log.d("log", "test" + responseBody);
                try {
                    HttpResponse response = client.execute(get);
                    InputStream inputStream = response.getEntity().getContent();
                    // responseBody = inputStream.toString();
                    responseBody = streamToString(inputStream);

                    Log.d("log", "test2" + responseBody);

                } catch (Exception ex) {
                    Log.d("log", "nope");
                    ex.printStackTrace();
                }

            }
        })).start();
    }

    public static String streamToString(InputStream is) {
        java.util.Scanner s = new java.util.Scanner(is).useDelimiter("\\A");
        return s.hasNext() ? s.next() : "";
    }

    @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;
    }

}
于 2013-04-06T22:24:07.220 に答える