3

インターネット上のWebページのソースコードからJSONテキストを解析するAndroidプログラムを作成しています。android 2.2で動作していますが、今はandroid 3.0で動作する必要があり、AsyncTaskで動作する必要があります。私はAsyncTaskのバックグラウンドを持っていますが、これとあれをどこに置くか混乱しています。みなさん、よろしくお願いします:)

MainActivityクラスのメソッドは次のとおりです。

private void jsonStuffs() {
    //JSON PARSER & HOME PAGE TEXTVIEWS

        client = new DefaultHttpClient();

        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 in the JSON in the webpage

                String temperature = obj.getString("temperature");
                TextView tvTemp = (TextView)findViewById(R.id.textView);
                tvTemp.setText(temperature);

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

GetMethodExクラスは次のとおりです(これにより、Webページのリンクが検索され、そのソースコードがテキスト形式に変換されます)。

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

2 に答える 2

2

あなたはこのようなことをすることができます(このコードは単なる説明のためのものであり、必要に応じて変更してください)

class MyAsyncTask extends AsyncTask<String, Void, JSONObject> {
     protected void onPreExecute() {
        // You can set your activity to show busy indicator
        //setProgressBarIndeterminateVisibility(true);
     }

    protected JSONObject doInBackground(String... args) {
        return jsonStuffs();
    }

    protected void onPostExecute(final JSONObject jsonObj) {
        String temperature = jsonObj.getString("temperature");
        TextView tvTemp = (TextView)findViewById(R.id.textView);
        tvTemp.setText(temperature);
        // Stop busy indicator
        //setProgressBarIndeterminateVisibility(false);
    }

このタスクを呼び出すには、次を使用しますnew MyAsyncTask().execute();(必要に応じて実行するパラメーターを渡すことができStringます)jsonStuffs()JSONObject

例えば

private JSONObject jsonStuffs() {

     // ...

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

     // ...
 }
于 2013-02-11T08:18:11.163 に答える
1

それはAndroid 2.2で動作していますが、AsyncTask上にある必要があるAndroid 3.0上にある必要があります。

=> はい、AsyncTask などの Thread 内に実装せずに Web 呼び出しを行うと、3.0 でNetworkOnMainThreadExceptionが発生します。

私は AsyncTask についてのバックグラウンドを持っていますが、これとそれをどこに置くべきかとても混乱しています。

=> doInBackground()AsyncTask のメソッド内に Web 呼び出しロジックを含めるだけです。この場合は、内部で getInternetData() を呼び出しますdoInBackground()

参考までに、doInBackground() 内で長時間実行されるタスクを実行している間は、UI を直接更新することはできません。はい、UI を更新する場合は、以下のいずれかに従ってください。

  1. onPostExecute() メソッドから UI を更新します。
  2. runOnUiThread()または内部で実装するdoInBackround()
于 2013-02-11T08:13:56.963 に答える