0

私はプログラミングが初めてで、json パーサーを作成していますが、スレッド メソッドにアクセスできません。これを行うにはどうすればよいですか。デバッグすると、getjson メソッドに入りますが、run メソッドをスキップします。私はすでにスタックオーバーフローを検索しましたが、スレッドについて非常に混乱しています。これを行う良い方法はありますか?

public class jsonParser {
 static InputStream is = null;
    static JSONObject jObj = null;
    static String json = "";
    // constructor
    public jsonParser() {

    }

    public JSONObject getJSONFromUrl(final String url) {

         Thread t = new Thread() {

public  void run() {
Looper.prepare(); //For Preparing Message Pool for the child Thread
       // 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 parse the string to a JSON object

            try {jObj = new JSONObject(json);
            } catch (JSONException e) {
                // TODO Auto-generated catch block
Log.e("JSON Parser", "Error parsing data " + e.toString());     
                 }
            Looper.loop(); 
       return;     
      }
}; t.start();
return jObj;      
         }
                }
4

1 に答える 1

0

メソッドに行きrun()ます。ただし、スレッドの原則は、現在のスレッドと並行して実行されることです。タイムラインで何が起こるかは次のとおりです。

main thread
_______________________________________________________________________
    |                    |
    start parser thread  return jObj

parser thread
      _________________________________________________________________
       |                                                       |
       execute an HTTP request and parse json                  assign JSON object to jObj

現在のスレッドから戻るjObjと、パーサー スレッドを開始したことになります。たぶん、まだ実行を開始していません。HTTP 応答を待っている可能性があります。確かなことは、実行が終了し、結果が静的な jObj 変数にまだ格納されている可能性が 0% あるということです。したがって、現在のスレッドから返される値は null です。

スレッド化と android が提供するサポート クラスの詳細を読むことを除けば、何をすべきかを説明するのは困難です。

于 2013-07-18T14:05:20.130 に答える