1

明らかに私がここで見逃しているものがあります-私はAsyncTasksとスレッドに関するdeveloper.androidリファレンスとガイド資料を読んでいます-そしてここにたくさんの投稿があります、そしてそれは私の最初のロデオでもありません。URLからJSONを取得して解析する内部AsyncTaskクラスがあります。アクセスの問題が発生し続けており、適切な組み合わせが得られないようです。これは、メインのパブリッククラスである「Consumer」の途中にあるコードのチャンクです。より多くのコードを広告することはできますが、これは何が必要かを示していると思います。TIA!

// some method
if(arg1==b){
    b.setClickable(false);  
    a.setClickable(true); 
    // next, build the url
    srchStr = urla + "&q=upc:" + value1 + urlc;
    // execute the parser
    new JSONParser().execute(value1);
}

// ...

static class JSONParser extends AsyncTask<String, Void, JSONObject> {
    static InputStream is = null; 
    static JSONObject jObj = null; 
    static String json = "";      


    public JSONObject doInBackground(String url) {    //getJSONFromUrl
        // Making HTTP request 
        try { 
            // defaultHttpClient 
            DefaultHttpClient httpClient = new DefaultHttpClient(); 
            HttpPost httpPost = new HttpPost(url);    
            HttpResponse httpResponse = httpClient.execute(httpPost); 
            HttpEntity httpEntity = httpResponse.getEntity(); 
            is = httpEntity.getContent();            

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

        try { 
            BufferedReader reader = new BufferedReader(new InputStreamReader( 
                    is, "iso-8859-1"), 8); 
            StringBuilder sb = new StringBuilder(); 
            String line = null; 
            while ((line = reader.readLine()) != null) { 
                sb.append(line + "\n"); 
            } 
            is.close(); 
            json = sb.toString(); 
        } catch (Exception e) { 
            Log.e("Buffer Error", "Error converting result " + e.toString()); 
        } 

        // try to parse the string to a JSON object 
        try { 
            jObj = new JSONObject(json); 
        } catch (JSONException e) { 
            Log.e("JSON Parser", "Error parsing data " + e.toString()); 
        } 

        // return JSON String 
        return jObj;      
    } 
    protected void onPostExecute(String result) {
        //TextView tv2 = (TextView) findViewById(R.id.tv2);
        tv2.setText("json"); // txt.setText(result);


    }       
}

次の行にエラーが表示されます。

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

これは:

タイプConsumer.JSONParserは、継承された抽象メソッドAsyncTask.doInBackground(String ...)を実装する必要があります

....まだ、doInBackgroundメソッドがあります....。

これがこれをトラブルシューティングするのに十分な情報であることを願っています。私が見逃していたのは単純なことだと思います。

更新:推奨される変更を加えました。確かに理にかなっているためですが、現在はコンパイルされますが、実行されません。もう一度見て、私が間違っているかどうか、またはこれが別の問題であるかどうかを知らせてください...更新されたコードは次のとおりです。

if(arg1==b){
    b.setClickable(false);  
    a.setClickable(true); 
    // next, build the url
    srchStr = urla + "&q=upc:" + value1 + urlc;
    // execute the parser
    new JSONParser().execute(value1);
    }   
}

    static class JSONParser extends AsyncTask<String, Void, JSONObject> {
    static InputStream is = null; 
    static JSONObject jObj = null; 
    static String json = "";      


     public JSONObject doInBackground(String... urls) {       //getJSONFromUrl
         Consumer.srchStr = urls[0];
        // Making HTTP request 
        try { 
            // defaultHttpClient 
            DefaultHttpClient httpClient = new DefaultHttpClient(); 
            HttpPost httpPost = new HttpPost(srchStr);    
            HttpResponse httpResponse = httpClient.execute(httpPost); 
            HttpEntity httpEntity = httpResponse.getEntity(); 
            is = httpEntity.getContent();            

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

        try { 
            BufferedReader reader = new BufferedReader(new InputStreamReader( 
                    is, "iso-8859-1"), 8); 
            StringBuilder sb = new StringBuilder(); 
            String line = null; 
            while ((line = reader.readLine()) != null) { 
                sb.append(line + "\n"); 
            } 
            is.close(); 
            json = sb.toString(); 
        } catch (Exception e) { 
            Log.e("Buffer Error", "Error converting result " + e.toString()); 
        } 

        // try to parse the string to a JSON object 
        try { 
            jObj = new JSONObject(json); 
        } catch (JSONException e) { 
            Log.e("JSON Parser", "Error parsing data " + e.toString()); 
        } 

        // return JSON String 
        return jObj;      
    } 
    protected void onPostExecute(JSONObject result) {
        //TextView tv2 = (TextView) findViewById(R.id.tv2);
        result = jObj;
        tv2.setText("result"); // txt.setText(result);          
    }       
}
}

およびlogcatテキスト:

12-29 21:35:25.530: W/dalvikvm(2237): threadid=7: thread exiting with uncaught exception (group=0x4001d800)
12-29 21:35:25.605: E/AndroidRuntime(2237): FATAL EXCEPTION: AsyncTask #1
12-29 21:35:25.605: E/AndroidRuntime(2237): java.lang.RuntimeException: An error occured while executing doInBackground()
12-29 21:35:25.605: E/AndroidRuntime(2237):     at android.os.AsyncTask$3.done(AsyncTask.java:200)
12-29 21:35:25.605: E/AndroidRuntime(2237):     at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
12-29 21:35:25.605: E/AndroidRuntime(2237):     at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
12-29 21:35:25.605: E/AndroidRuntime(2237):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
12-29 21:35:25.605: E/AndroidRuntime(2237):     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
12-29 21:35:25.605: E/AndroidRuntime(2237):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
12-29 21:35:25.605: E/AndroidRuntime(2237):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
12-29 21:35:25.605: E/AndroidRuntime(2237):     at java.lang.Thread.run(Thread.java:1096)
12-29 21:35:25.605: E/AndroidRuntime(2237): Caused by: java.lang.IllegalStateException: Target host must not be null, or set in parameters.
12-29 21:35:25.605: E/AndroidRuntime(2237):     at org.apache.http.impl.client.DefaultRequestDirector.determineRoute(DefaultRequestDirector.java:561)
12-29 21:35:25.605: E/AndroidRuntime(2237):     at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:292)
12-29 21:35:25.605: E/AndroidRuntime(2237):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
12-29 21:35:25.605: E/AndroidRuntime(2237):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
12-29 21:35:25.605: E/AndroidRuntime(2237):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
12-29 21:35:25.605: E/AndroidRuntime(2237):     at com.clicsys.pbuster.Consumer$JSONParser.doInBackground(Consumer.java:116)
12-29 21:35:25.605: E/AndroidRuntime(2237):     at com.clicsys.pbuster.Consumer$JSONParser.doInBackground(Consumer.java:1)
12-29 21:35:25.605: E/AndroidRuntime(2237):     at android.os.AsyncTask$2.call(AsyncTask.java:185)
12-29 21:35:25.605: E/AndroidRuntime(2237):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
12-29 21:35:25.605: E/AndroidRuntime(2237):     ... 4 more
4

1 に答える 1

2

メソッドのシグネチャを変更する必要があります。

public JSONObject doInBackground(String... url)

これはdoInBackground()、無限の量の引数を受け入れるためです。あなたが望むアクセスをするためStringに、あなたはそれからすることができます

String currentUrl = url [0];

また、onPostExecuteにJSONObjectは引数としてaが必要です。これは、1つの引数でのみ受け入れる...ため、を使用しません。onPostExecute()

于 2012-12-29T17:12:13.673 に答える