2013-03-21 111 views
3

我已经使用AsyncTask在JSON解析上编写了一个简单的代码。我只是在TextView中显示响应。我不知道这是对还是错。它在GingerBread上工作并在果冻豆上显示NetworkOnMainThreadException。如果我使用StrictMode,它在JellyBean上工作,并在GingerBread上关闭。如何编写支持以上Android 3.0及以下Android 3.0的代码。Android严格模式

public class MainActivity extends Activity { 
TextView tv; 
Button b; 
InputStream is = null; 

DefaultHttpClient client; 
HttpGet get; 
HttpResponse response; 
HttpEntity entity; 
StringBuffer buffer; 

@SuppressLint("NewApi") 
@TargetApi(Build.VERSION_CODES.GINGERBREAD) 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    //StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
    // StrictMode.setThreadPolicy(policy); 
    tv = (TextView) findViewById(R.id.texty); 
    b = (Button) findViewById(R.id.buttonGET); 

    b.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      MyOperation mytask = new MyOperation(); 
      mytask.execute(); 
     } 
    }); 

} 

private class MyOperation extends AsyncTask<String, Void, String> { 
    ProgressDialog dialog = new ProgressDialog(MainActivity.this); 

    @Override 
    protected void onPreExecute() { 
     // TODO Auto-generated method stub 
     super.onPreExecute(); 
     dialog.setMessage("Loading..."); 
     dialog.show(); 
    } 

    @Override 
    protected String doInBackground(String... params) { 
     // TODO Auto-generated method stub 
     client = new DefaultHttpClient(); 
     get = new HttpGet("http://www.google.com"); 
     try { 
      response = client.execute(get); 
     } catch (ClientProtocolException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     entity = response.getEntity(); 

     try { 
      is = entity.getContent(); 
     } catch (IllegalStateException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     return null; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     // TODO Auto-generated method stub 

     super.onPostExecute(result); 
     dialog.dismiss(); 
     BufferedReader reader = new BufferedReader(
       new InputStreamReader(is)); 
     StringBuffer buffer = new StringBuffer(); 
     String line = null; 
     do { 
      try { 
       line = reader.readLine(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      buffer.append(line); 
     } while (line != null); 
     tv.setText(buffer); 
    } 

} 

}

回答

2
public class MainActivity extends Activity { 
    TextView tv; 
    Button b; 
    InputStream is = null; 

    DefaultHttpClient client; 
    HttpGet get; 
    HttpResponse response; 
HttpEntity entity; 
StringBuffer buffer; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    //StrictMode.ThreadPolicy policy = new 
    // StrictMode.setThreadPolicy(policy); 
    tv = (TextView) findViewById(R.id.texty); 
    b = (Button) findViewById(R.id.buttonGET); 

    b.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      MyOperation mytask = new MyOperation(); 
      mytask.execute(); 
     } 
    }); 

} 

private class MyOperation extends AsyncTask<String, Void, String> { 
    ProgressDialog dialog = new ProgressDialog(MainActivity.this); 

    @Override 
    protected void onPreExecute() { 
     // TODO Auto-generated method stub 
     super.onPreExecute(); 
     dialog.setMessage("Loading..."); 
     dialog.show(); 
    } 

    @Override 
    protected String doInBackground(String... params) { 
StringBuffer buffer = new StringBuffer(); 
     // TODO Auto-generated method stub 
     client = new DefaultHttpClient(); 
     get = new HttpGet("http://www.google.com"); 
     try { 
      response = client.execute(get); 
     } catch (ClientProtocolException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     entity = response.getEntity(); 

     try { 
      is = entity.getContent(); 
     } catch (IllegalStateException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    BufferedReader reader = new BufferedReader(
       new InputStreamReader(is)); 

     String line = null; 
     do { 
      try { 
       line = reader.readLine(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      buffer.append(line); 
     } while (line != null); 

     return buffer.tostring(); 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     // TODO Auto-generated method stub 

     super.onPostExecute(result); 
     dialog.dismiss(); 

     tv.setText(result); 
    }} 

} 

否则你正在运行的读线操作的主线程

1

请在doInBackground() InputStream的is和实体entity局部场变量作为回报结果是你想上的TextView设置串...并在onPostExecute()你刚才得到的结果(字符串),并直接将其设置在TextView中。

1

你应该在doInBackground函数读取的inputStream数据,而不是在onPostExecute。因此,在doInBackground中构造StringBuffer将所有行附加到它并返回StringBuffer.toString作为结果。在onPostExecute中,你会得到什么字符串作为参数。