所以,我一直在为客户端创建和应用程序并进入网络部分。我目前正在从 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/