0

インターネットから JSON データを取得する Android プログラムを作成しています。JSON テキストは、(HttpClient を使用して) Web ページのソース コードから取得され、それを解析して TextView に表示します。これは Froyo で動作していますが、Honeycomb 以降で動作するには AsyncTask で動作する必要があります。

この AsyncTask の問題のために、私は今とても混乱しています。いくつかのチュートリアルを試してみましたが、やりたいこととは異なります。エラーが発生するだけで、とてもイライラしています。助けてくれてありがとう!:)

これは MainActivity クラスの私のメソッドです:

private void jsonStuffs() {
            // TODO Auto-generated method stub
        //JSON PARSER & HOME PAGE TEXTVIEWS

            client = new DefaultHttpClient();
            //new Read().execute("id");
            //http client codes only no parser !!
            GetMethodEx test = new GetMethodEx();
            String returned;
            try {
                returned = test.getInternetData();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            try{
                String jsonStr = test.getInternetData(); //go to GetMethodEx
                    JSONObject obj = new JSONObject(jsonStr);

                    //find temperature on JSON on webpage
                    String temperature = obj.getString("temperature");
                    TextView tvTemp = (TextView)findViewById(R.id.temp);
                    tvTemp.setText(temperature);

            }
            //catch (JSONException e) {
                 // e.printStackTrace();
                //} 
            catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
        }

これは私の GetMethodEx クラスです:

public class GetMethodEx extends Activity {
public String getInternetData() throws Exception{

    BufferedReader in = null;
    String data = null;
    //

    try{
        HttpClient client = new DefaultHttpClient();
        URI website = new URI("http://nhjkv.comuf.com/json_only.php");
        HttpGet request = new HttpGet();
        request.setURI(website);
        HttpResponse response = client.execute(request);
        in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
        StringBuffer sb = new StringBuffer("");
        String l = "";
        String nl = System.getProperty("line.separator");
        while ((l = in.readLine()) !=null){
            sb.append(l + nl);
        }
        in.close();
        data = sb.toString();
        return data;
    }finally {
        if (in !=null){
            try{
                in.close();
                return data;
            } catch (Exception e){
                e.printStackTrace();
            }
        }
    }
}
}
4

3 に答える 3

1

接続部分を別のクラスとして作成し、以下のコードを入れます

public String getInternetData() throws Exception{

BufferedReader in = null;
String data = null;
//

try{
    HttpClient client = new DefaultHttpClient();
    URI website = new URI("http://nhjkv.comuf.com/json_only.php");
    HttpGet request = new HttpGet();
    request.setURI(website);
    HttpResponse response = client.execute(request);
    in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
    StringBuffer sb = new StringBuffer("");
    String l = "";
    String nl = System.getProperty("line.separator");
    while ((l = in.readLine()) !=null){
        sb.append(l + nl);
    }
    in.close();
    data = sb.toString();
    return data;
}finally {
    if (in !=null){
        try{
            in.close();
            return data;
        } catch (Exception e){
            e.printStackTrace();
        }
    }
}
}

このクラスをサービスとして使用する

public class TaskAsync extends AsyncTask<String, String, String> {

private String response = null;

@Override
protected String doInBackground(String... params) {
    response = new ClassName().getInternetData();
    return response;
}

}

次に、これをアクティビティに入れます

String response = new TaskAsync().execute("URL_WITH_PARAMETERS").get();
于 2013-01-22T07:34:13.603 に答える
1

AsyncTask を使用して webservice 呼び出しを行うようにコードを変更します。

private void jsonStuffs() {
            // TODO Auto-generated method stub

            try{

               new InternetDataOperation().execute("");

            }
            //catch (JSONException e) {
                 // e.printStackTrace();
                //} 
            catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
        }

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

      @Override
      protected void onPreExecute() {
      }

      @Override
      protected String doInBackground(String... params) {
        client = new DefaultHttpClient();

        GetMethodEx test = new GetMethodEx();
        String jsonStr = test.getInternetData(); //go to GetMethodEx
            return jsonStr;
      }      

      @Override
      protected void onPostExecute(String result) {  
         JSONObject obj = new JSONObject(result);

         //find temperature on JSON on webpage
         String temperature = obj.getString("temperature");
         TextView tvTemp = (TextView)findViewById(R.id.temp);
         tvTemp.setText(temperature);             
      }


}
于 2013-01-22T07:36:22.120 に答える
1

doInBackground メソッド内で findViewByID と textView を使用することはできません。onPostExecute で textView を使用できます。

メソッド「jsonStuffs()」を変更して、文字列を返すようにします。getInternetData() を別のアクティビティ クラスに配置する必要はありません。

MainActivity.class からの変更されたメソッド

private String jsonStuffs() {
            // TODO Auto-generated method stub
        //JSON PARSER & HOME PAGE TEXTVIEWS

            client = new DefaultHttpClient();
            //new Read().execute("id");
            //http client codes only no parser !!

            String returned;
            try {
                returned = getInternetData();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            try{
                String jsonStr = test.getInternetData(); //go to GetMethodEx
                    JSONObject obj = new JSONObject(jsonStr);

                    //find temperature on JSON on webpage
                    String temperature = obj.getString("temperature");
                    return temperature

            }
            //catch (JSONException e) {
                 // e.printStackTrace();
                //} 
            catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                    return null;
                }
        }

public String getInternetData() throws Exception{

    BufferedReader in = null;
    String data = null;
    //

    try{
        HttpClient client = new DefaultHttpClient();
        URI website = new URI("http://nhjkv.comuf.com/json_only.php");
        HttpGet request = new HttpGet();
        request.setURI(website);
        HttpResponse response = client.execute(request);
        in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
        StringBuffer sb = new StringBuffer("");
        String l = "";
        String nl = System.getProperty("line.separator");
        while ((l = in.readLine()) !=null){
            sb.append(l + nl);
        }
        in.close();
        data = sb.toString();
        return data;
    }finally {
        if (in !=null){
            try{
                in.close();
                return data;
            } catch (Exception e){
                e.printStackTrace();
            }
        }
    }
}
}

次に、次のように asynctask を作成します。

public class JsonDownloaderTask extends AsyncTask<Void, Void, String>{


    @Override
    protected Void doInBackground(Void... params) {
        return jsonStuff()
    }

    @Override
    protected void onPostExecute(String result){
        if(result != null){
            //DO YOUR STUFF WITH TEXTVIEW
        }
    }

}

MainActivity.class の onCreate() または onResume() メソッド内で textView を初期化する必要があります。

于 2013-01-22T07:55:51.923 に答える