0

古い Galaxy S でアプリを実行したところ、問題なく動作しましたが、Nexus S でいくつかのエラーが発生し始めました。URLEncoder.encode を使用して修正した JSONParser のパス エラーで無効な文字が発生していましたが、現在は無効な状態例外エラーが発生しています。ここを見ましたhttp://blog.donnfelker.com/2010/04/29/android-odd-error-in-defaulthttpclient/ しかし、私はすでに http:// を私のURLに持っていました。デバッガーで httpget の uri を確認しました。ここで何を探しているのか正確にはわかりません。上記でリンクした記事のコメントで示唆されているようにエンコードされるべきではない文字がエンコードされているかどうかを確認しようとしていることは知っていますが、それを行う方法がわかりません。JSONParser.doInBackground メソッドの httpGet の下にある URI をクリックすると、%5BLjava.lang.String%3B%4042b3f010 が表示されます。これは URLEncoder.encode からエンコードされた表現であるというのは正しいですか? JSONParser.doInBackground に StringBuilder 型の URL を渡し、これを String に変換してからエンコードします。デバッガーの myURL エントリは、URI と同じ %5BLjava.lang.String%3B%4042b3f010 を返します。私はこれを正しく行うつもりですか?助けてくれてありがとう。

public class JSONParser extends AsyncTask<String, Void, JSONObject> {

static InputStream inputStream = null;
static JSONObject jObject = null;
static String jSon = "";
protected JSONObject doInBackground(String... url) {
    // TODO Auto-generated method stub

    //Make HTTP Request
            try {
                //defaultHttpClient
                DefaultHttpClient httpClient = new DefaultHttpClient();
                String myURL = url.toString(); 
                myURL = URLEncoder.encode(myURL, "utf-8");
                HttpGet httpGet = new HttpGet(myURL);

                //header
                httpGet.setHeader("Accept", "application/json");

                HttpResponse httpResponse = httpClient.execute(httpGet);
                HttpEntity httpEntity = httpResponse.getEntity();
                inputStream = httpEntity.getContent();

            } catch (UnsupportedEncodingException e){
                e.printStackTrace();
            } catch (ClientProtocolException e){
                e.printStackTrace();
            }catch (IOException e){
                e.printStackTrace();
            }

            try {
                BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"), 8);
                StringBuilder stringBuilder = new StringBuilder();
                String line = null;
                while ((line = reader.readLine()) != null){
                    stringBuilder.append(line + "\n");
                }
                Log.d("JSON Contents", stringBuilder.toString());
                inputStream.close();

                jSon = stringBuilder.toString();


            } catch (Exception e){
                Log.e("Buffer Error", "Error converting result " + e.toString());
            }
            //try to parse the string to JSON Object
            try {
                jObject = new JSONObject(jSon);

            } catch (JSONException e){
                Log.e("JSON Parser", "Error parsing data " + e.toString());
            }
            //return JSON String
            return jObject;
}

}

これは、パーサーに渡す URL を構築する方法です。

public class getName {
static String nameOne = null;
static String nameTwo = null;

static StringBuilder personURLOne = new StringBuilder();
static StringBuilder personURLTwo = new StringBuilder();

public static String personURL = "http://api.themoviedb.org/3/search/person?api_key=bb0b6d66c2899aefb4d0863b0d37dc4e&query=";

public static StringBuilder getName1(EditText searchOne){
    nameOne = searchOne.getText().toString();


    nameOne = nameOne.replace(" ", "_");


    personURLOne.append(personURL); 
    personURLOne = personURLOne.append(nameOne);



    return personURLOne;

}

どんな助けにも感謝します

更新 - JSONParser でコードを次のように変更しました。

public class JSONParser extends AsyncTask<String, Void, JSONObject> {

static InputStream inputStream = null;
static JSONObject jObject = null;
static String jSon = "";
public String myURL;
protected JSONObject doInBackground(String... url) {
    // TODO Auto-generated method stub

    //Make HTTP Request
            try {
                //defaultHttpClient
                DefaultHttpClient httpClient = new DefaultHttpClient();
                for(int i = 0; i < url.length; i++){
                     myURL = url[0];
                     myURL = URLEncoder.encode(myURL, "utf-8");
                }
                HttpGet httpGet = new HttpGet(myURL);
4

1 に答える 1

0

これを URL デコードすると、%5BLjava.lang.String%3B%4042b3f010が得られ[Ljava.lang.String;@42b3f010ます。

これは非常に怪しいです。URL ではありません。配列を呼び出すtoStringと、開き括弧が付いた面白い文字列が得られます。たとえば、int の配列は次のように出力されます[I@33f42b49

これはurldoInBackGroundメソッドが実際には文字列ではなく文字列の配列であるためです。これdoInBackgroundは、可変数の文字列パラメーターを取るためです。doInBackground(String...その省略記号は、varag を持つメソッドを示します。だからあなたはそれをまったく呼びたくありませんtoString

代わりに、それを反復処理してすべてをダウンロードするか、最初の : だけを取得する必要がありますurl[0]urlsわかりやすくするために、名前も変更します:)

于 2012-09-15T03:54:04.440 に答える