java - Android 主线程上的网络使用情况

标签 java android multithreading http

所以,我一直在为客户端创建和应用程序并进入网络部分。我目前正在从 list 中删除 targetSDK 标签,因此我不会收到 MainThreadException。我见过有人和文档说我不应该在主线程上执行网络操作,因为它速度较慢......

问题:在哪里以及如何进行网络操作而不在主线程上进行? 代码如下:

  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) {

        int i = getArguments().getInt(ARG_MAGAZINE_NUMBER);
        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();
            } 
        }

        String magazine = getResources().getStringArray(R.array.magazine_array)[i];
        Log.d("MagFragment", "MagNumber" + i);

        getActivity().setTitle(magazine);
        return rootView;
    }
}

最佳答案

不不不,不要自己实现这个,除非您这样做是为了了解线程和异步任务。我建议您使用构建在 Android 类之上的现有库,并抽象出所有繁琐的和容易出错的代码。

您应该使用类似 Android Async Http Client 的内容,它是“一个基于异步回调的 Android Http 客户端,构建在 Apache 的 HttpClient 库之上。所有请求都是在应用程序的主 UI 线程之外发出的,但任何回调逻辑都将在使用创建回调的同一线程上执行Android 的 Handler 消息传递。”

关于java - Android 主线程上的网络使用情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16701421/

相关文章:

java - 使用 PrintWriter 将字符串写入日志文件

java - 无法在 child() firebase 错误中为参数 'pathString' 传递 null

Android:在 res/values 中组织字符串和字符串数组

java - 为什么异步线程不能同时修改 ArrayList?

multithreading - Haskell 中的半显式并行性

java - 在 Swing 的 EDT 中实现线程?

java - gradle:没有源任务 ':processTestResources'和 ':processtResources'

java - 使用单例类、Tomcat、C3P0 在 Java Web 应用程序中管理池数据源

java - 使用 'OPE' =? 等语法时,字符串到数字的转换失败

android - 谷歌地图不适用于谷歌游戏