我有一个脚本,强制关闭,只有当我调试运行在更高的API:16,但它工作正常,当它走到了API:10。难道是我的项目设置的问题
有一个简单的请求到服务器,以获得在一个片段的类别的列表。
gallery.java
公共类库扩展片段{
JSONArray jArray;
字符串结果= NULL;
InputStream的是= NULL;
StringBuilder的SB = NULL;
私人的ListView storeList;
@覆盖
公共查看onCreateView(LayoutInflater充气,容器的ViewGroup,
捆绑savedInstanceState){
// TODO自动生成方法存根
查看myFragmentView = inflater.inflate(R.layout.tab_frag1_layout,
集装箱,假);
storeList =(ListView控件)inflater.inflate(R.layout.list,NULL);
返回myFragmentView;
}
@覆盖
公共无效的onCreate(包savedInstanceState){
// TODO自动生成方法存根
super.onCreate(savedInstanceState);
}
@覆盖
公共无效onActivityCreated(包savedInstanceState){
// TODO自动生成方法存根
super.onActivityCreated(savedInstanceState);
ArrayList的<的NameValuePair> namevaluepairs中=新的ArrayList<的NameValuePair>();
// HTTP POST
尝试 {
HttpClient的HttpClient的=新DefaultHttpClient();
HttpPost httppost =新HttpPost(
http://xxx.xxx.xxx/android_link.php);
httppost.setEntity(新UrlEn codedFormEntity(namevaluepairs中));
HTT presponse响应= httpclient.execute(httppost);
HttpEntity实体= response.getEntity();
是= entity.getContent();
}赶上(例外五){
Log.e(log_tag,错误的HTTP连接+ e.toString());
}
//转换响应串
尝试 {
的BufferedReader读卡器=新的BufferedReader(新的InputStreamReader(
是,ISO-8859-1),8);
SB =新的StringBuilder();
sb.append(reader.readLine()+\ N);
串行=0;
而((行= reader.readLine())!= NULL){
sb.append(行+\ N);
}
is.close();
结果= sb.toString();
}赶上(例外五){
Log.e(log_tag,错误转换结果+ e.toString());
}
//配对数据
INT CT_ID;
字符串ct_name;
尝试 {
jArray =新JSONArray(结果);
JSONObject的json_data = NULL;
的for(int i = 0; I< jArray.length();我++){
json_data = jArray.getJSONObject(ⅰ);
CT_ID = json_data.getInt(brand_id);
ct_name = json_data.getString(series_name);
}
}赶上(JSONException E1){
Toast.makeText(getActivity(),没有找到结果,Toast.LENGTH_LONG)
。显示();
}赶上(ParseException的E1){
e1.printStackTrace();
}
}
log.txt的
三月一日至29日:25:54.653:E / log_tag(4324):在HTTP connectionandroid.os.NetworkOnMainThreadException错误
三月一日至29日:25:54.653:E / log_tag(4324):错误转换结果显示java.lang.NullPointerException
三月一日至29日:25:54.653:W / dalvikvm(4324):主题ID = 1:螺纹退出与未捕获的异常(组= 0xb5e98288)
三月一日至29日:25:54.653:E / AndroidRuntime(4324):致命异常:主要
三月一日至29日:25:54.653:E / AndroidRuntime(4324):显示java.lang.NullPointerException
三月一日至29日:25:54.653:E / AndroidRuntime(4324):在org.json.JSONTokener.nextCleanInternal(JSONTokener.java:116)
三月一日至29日:25:54.653:E / AndroidRuntime(4324):在org.json.JSONTokener.nextValue(JSONTokener.java:94)
三月一日至29日:25:54.653:E / AndroidRuntime(4324):在org.json.JSONArray< INIT>(JSONArray.java:87)
三月一日至29日:25:54.653:E / AndroidRuntime(4324):在org.json.JSONArray< INIT>(JSONArray.java:103)
三月一日至29日:25:54.653:E / AndroidRuntime(4324):在com.nazartt.angtrading.gallery.onActivityCreated(gallery.java:93)
三月一日至29日:25:54.653:E / AndroidRuntime(4324):在android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:891)
三月一日至29日:25:54.653:E / AndroidRuntime(4324):在android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1080)
三月一日至29日:25:54.653:E / AndroidRuntime(4324):在android.support.v4.app.BackStackRecord.run(BackStackRecord.java:622)
三月一日至29日:25:54.653:E / AndroidRuntime(4324):在android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1416)
三月一日至29日:25:54.653:E / AndroidRuntime(4324):在android.support.v4.app.FragmentManagerImpl $ 1.运行(FragmentManager.java:420)
三月一日至29日:25:54.653:E / AndroidRuntime(4324):在android.os.Handler.handleCallback(Handler.java:615)
三月一日至29日:25:54.653:E / AndroidRuntime(4324):在android.os.Handler.dispatchMessage(Handler.java:92)
三月一日至29日:25:54.653:E / AndroidRuntime(4324):在android.os.Looper.loop(Looper.java:137)
三月一日至29日:25:54.653:E / AndroidRuntime(4324):在android.app.ActivityThread.main(ActivityThread.java:4745)
三月一日至29日:25:54.653:E / AndroidRuntime(4324):在java.lang.reflect.Method.invokeNative(本机方法)
三月一日至29日:25:54.653:E / AndroidRuntime(4324):在java.lang.reflect.Method.invoke(Method.java:511)
三月一日至29日:25:54.653:E / AndroidRuntime(4324):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:786)
三月一日至29日:25:54.653:E / AndroidRuntime(4324):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
三月一日至29日:25:54.653:E / AndroidRuntime(4324):在dalvik.system.NativeStart.main(本机方法)
解决方案
您有一个的 NetworkOnMainThreadException
发生在Android(3.0+),如果你尝试做网络运营主(UI)线程(的 StrictMode
),.请使用 AsyncTask的
为您的网络运营,这是简单的设置和工作在一个合乎逻辑的方式(执行的东西在后台那么一旦大功告成,发布到UI线程)。
I am having a script force close only when i debug on higher API : 16 , But it is working fine when it come to an API : 10. Could it be my project setup problem?
It is a simple request to a server to get list of category in a fragment.
gallery.java
public class gallery extends Fragment {
JSONArray jArray;
String result = null;
InputStream is = null;
StringBuilder sb = null;
private ListView storeList;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
View myFragmentView = inflater.inflate(R.layout.tab_frag1_layout,
container, false);
storeList = (ListView) inflater.inflate(R.layout.list, null);
return myFragmentView;
}
@Override
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
// http post
try {
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(
"http://xxx.xxx.xxx/android_link.php");
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
is = entity.getContent();
} catch (Exception e) {
Log.e("log_tag", "Error in http connection" + e.toString());
}
// convert response to string
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(
is, "iso-8859-1"), 8);
sb = new StringBuilder();
sb.append(reader.readLine() + "\n");
String line = "0";
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
is.close();
result = sb.toString();
} catch (Exception e) {
Log.e("log_tag", "Error converting result " + e.toString());
}
// paring data
int ct_id;
String ct_name;
try {
jArray = new JSONArray(result);
JSONObject json_data = null;
for (int i = 0; i < jArray.length(); i++) {
json_data = jArray.getJSONObject(i);
ct_id = json_data.getInt("brand_id");
ct_name = json_data.getString("series_name");
}
} catch (JSONException e1) {
Toast.makeText(getActivity(), "No Data Found", Toast.LENGTH_LONG)
.show();
} catch (ParseException e1) {
e1.printStackTrace();
}
}
log.txt
01-29 03:25:54.653: E/log_tag(4324): Error in http connectionandroid.os.NetworkOnMainThreadException
01-29 03:25:54.653: E/log_tag(4324): Error converting result java.lang.NullPointerException
01-29 03:25:54.653: W/dalvikvm(4324): threadid=1: thread exiting with uncaught exception (group=0xb5e98288)
01-29 03:25:54.653: E/AndroidRuntime(4324): FATAL EXCEPTION: main
01-29 03:25:54.653: E/AndroidRuntime(4324): java.lang.NullPointerException
01-29 03:25:54.653: E/AndroidRuntime(4324): at org.json.JSONTokener.nextCleanInternal(JSONTokener.java:116)
01-29 03:25:54.653: E/AndroidRuntime(4324): at org.json.JSONTokener.nextValue(JSONTokener.java:94)
01-29 03:25:54.653: E/AndroidRuntime(4324): at org.json.JSONArray.<init>(JSONArray.java:87)
01-29 03:25:54.653: E/AndroidRuntime(4324): at org.json.JSONArray.<init>(JSONArray.java:103)
01-29 03:25:54.653: E/AndroidRuntime(4324): at com.nazartt.angtrading.gallery.onActivityCreated(gallery.java:93)
01-29 03:25:54.653: E/AndroidRuntime(4324): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:891)
01-29 03:25:54.653: E/AndroidRuntime(4324): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1080)
01-29 03:25:54.653: E/AndroidRuntime(4324): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:622)
01-29 03:25:54.653: E/AndroidRuntime(4324): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1416)
01-29 03:25:54.653: E/AndroidRuntime(4324): at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:420)
01-29 03:25:54.653: E/AndroidRuntime(4324): at android.os.Handler.handleCallback(Handler.java:615)
01-29 03:25:54.653: E/AndroidRuntime(4324): at android.os.Handler.dispatchMessage(Handler.java:92)
01-29 03:25:54.653: E/AndroidRuntime(4324): at android.os.Looper.loop(Looper.java:137)
01-29 03:25:54.653: E/AndroidRuntime(4324): at android.app.ActivityThread.main(ActivityThread.java:4745)
01-29 03:25:54.653: E/AndroidRuntime(4324): at java.lang.reflect.Method.invokeNative(Native Method)
01-29 03:25:54.653: E/AndroidRuntime(4324): at java.lang.reflect.Method.invoke(Method.java:511)
01-29 03:25:54.653: E/AndroidRuntime(4324): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
01-29 03:25:54.653: E/AndroidRuntime(4324): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
01-29 03:25:54.653: E/AndroidRuntime(4324): at dalvik.system.NativeStart.main(Native Method)
解决方案
You have a NetworkOnMainThreadException
which occurs on the new versions of Android (3.0+) if you try to do network operations on the main (UI) Thread (StrictMode
),. Use an AsyncTask
for your network operations, it's simple to set up, and operates in a logical manner (execute something in background then once you're done, publish to UI Thread).