0

我正在尝试使用 JSON 从 Internet 中的 php 文件中获取数据。它适用于普通类,但在使用片段时不起作用。

      public static class MagFragment extends Fragment {
    public static final String ARG_MAGAZINE_NUMBER = "magazine_number";

    public MagFragment() {
        // Empty constructor required for fragment subclasses
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_main, container, false);
        if(i != 0){
            rootView = inflater.inflate(R.layout.fragment_magazine, container, false);
            TextView magText = (TextView) rootView.findViewById(R.id.textViewMag);
            try {

                HttpClient httpclient = new DefaultHttpClient();
                HttpPost httppost = new HttpPost("http://csddata.site11.com");
                HttpResponse response = httpclient.execute(httppost);

                HttpEntity httpEntity = response.getEntity();
                InputStream inputstream = httpEntity.getContent();
                try{

                    BufferedReader reader = new BufferedReader(new InputStreamReader(inputstream,"iso-8859-1"),8);
                    magText.setText(reader.readLine());

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


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

        return rootView;
    }
}

它在一个普通的类中工作,所以它一定是因为它是一个片段。

我不知道如何复制和粘贴错误……但唯一说明错误在哪一行的错误是“HttpResponse response = httpclient.execute(httppost);” 线!

4

2 回答 2

6

作为参考,以前在 UI 线程上完成网络操作非常普遍。发生这种情况时,反应非常迟缓,而且通常以难以预测的方式进行。为了防止这种情况发生,Google 禁止用户在 UI 线程上进行操作,而是鼓励使用 AsyncTask 和 Threads 之类的东西来获取网络信息,并在以后更新数据。

任何时候你有一个可能需要一段时间的操作,你应该在一个线程上操作,而不是在 UI 线程上。在那里操作可能会导致各种问题。Android 将其作为运行时错误是有原因的,虽然有时它可能很烦人,但永远不应该这样做,特别是如果您打算发布代码。尤其是永远不要在 UI 线程上进行网络操作!!!!!!

在您的情况下,正确的解决方案是这样的(未检查语法,但应该关闭......):

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_main, container, false);
    if(i != 0){
        rootView = inflater.inflate(R.layout.fragment_magazine, container, false);
        TextView magText = (TextView) rootView.findViewById(R.id.textViewMag);
        new GetData("http://csddata.site11.com").execute();
    }
}

class GetData extends AsyncTask<String,Void,String>
{
    protected String doInBackground(String... urls) {
            String text="";
            try {

                HttpClient httpclient = new DefaultHttpClient();
                HttpPost httppost = new HttpPost(urls[0]);
                HttpResponse response = httpclient.execute(httppost);

                HttpEntity httpEntity = response.getEntity();
                InputStream inputstream = httpEntity.getContent();
                try{

                    BufferedReader reader = new BufferedReader(new InputStreamReader(inputstream,"iso-8859-1"),8);
                    text=reader.readLine();

                }catch (Exception e){
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                return textl
    }
    @Override
    protect void onPostResults(String result) {
        magText.setText(result);
    }
}
于 2014-01-10T14:25:29.197 回答
-7

我已经弄清楚了原因。如果在线程中完成网络操作,Android SDK 11 会通过异常,因此通过删除目标 SDK 可以正常工作。

于 2013-05-22T12:43:51.627 回答