首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android严格模式

Android严格模式
EN

Stack Overflow用户
提问于 2013-03-21 18:26:22
回答 3查看 2.9K关注 0票数 3

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

代码语言:javascript
复制
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);
    }

}

}

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-21 18:32:36

代码语言:javascript
复制
   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);
    }}

}

否则,您将在主线程中运行读取行操作

票数 2
EN

Stack Overflow用户

发布于 2013-03-21 18:29:02

使doInBackground()中的is和Entity entity局部字段变量返回您希望在onPostExecute()上的TextView上设置的字符串,您只需获取结果(字符串)并将其直接设置在TextView中即可。

票数 1
EN

Stack Overflow用户

发布于 2013-03-21 18:32:58

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15544886

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档