android.os.NetworkOnMainThreadException在AsynkTask类 [英] android.os.NetworkOnMainThreadException in AsynkTask Class
问题描述
我想与 JSON
来从网上得到的数据,我使用的是 AsynkTask
类做其工作,但如果我添加或更改任何
code,然后再次运行我的程序停止与 android.os.NetworkOnMainThreadException
工作
但我从来不跑了主线程
这个code,我必须在修复项目
单击,然后清洁
项目,然后再次运行,再次运行正常,请问是什么问题?
我的code的工作如下:
i want to get data from the internet with JSON
, i'm using an AsynkTask
class to do that and its working, but if i add or change any
code and run my program again it stops working with android.os.NetworkOnMainThreadException
But i never ran this code on the main thread
, and i must click on fix project
, then clean
project and run again and it works fine again, what is the problem?
My code that is working is as follows:
public class NetworkDocStateThread extends AsyncTask<String, Void, Void> {
HttpResponse responseState;
@Override
protected Void doInBackground(String... params) {
try {
responseState = JsonDocumnet
.SendDocumentState(Financial.selectedGuId);
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void post) {
try {
Financial.documnetStateDs = JsonDocumnet
.DocumentState(responseState);
documentStateSpinner.add(Financial.documnetStateDs.get(i)
.getTitle());
}
SpinnerStateAdapter = new ArrayAdapter<String>(Documnet.this,
R.layout.spinnlayout, R.id.docstateid,
documentStateSpinner);
SpinnerNumAdapter = new ArrayAdapter<String>(Documnet.this,
R.layout.spinnlayout, R.id.docstateid, getResources()
.getStringArray(R.array.numPerPage));
SpinnerSortAdapter = new ArrayAdapter<String>(Documnet.this,
R.layout.spinnlayout, R.id.docstateid, getResources()
.getStringArray(R.array.SortBy));
new NetworkDocThread().execute(Financial.selectedGuId, "5",
"0", "Id", "-1");
docStateSpinner.setAdapter(SpinnerStateAdapter);
NumberPerPageSpinner.setAdapter(SpinnerNumAdapter);
SortBySpinner.setAdapter(SpinnerSortAdapter);
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
super.onPostExecute(post);
}
}
和第二类AsyncTask的:
and second AsyncTask class:
public class NetworkDocThread extends AsyncTask<String, Void, Void> {
HttpResponse responseDoc;
@Override
protected Void doInBackground(String... s) {
try {
responseDoc = JsonDocumnet.SendDocumnet(s[0], s[1], s[2], s[3],
s[4]);
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void post) {
try {
Financial.docs = JsonDocumnet.Document(responseDoc);
CreatingData();
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
;
}
dialog.dismiss();
}
}
}
和清单文件:
<uses-permission android:name="android.permission.INTERNET" />
和我的 LogCat中
错误
12-03 05:08:43.022: E/AndroidRuntime(1106): FATAL EXCEPTION: main
12-03 05:08:43.022: E/AndroidRuntime(1106): android.os.NetworkOnMainThreadException
12-03 05:08:43.022: E/AndroidRuntime(1106): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117)
12-03 05:08:43.022: E/AndroidRuntime(1106): at libcore.io.BlockGuardOs.recvfrom(BlockGuardOs.java:163)
12-03 05:08:43.022: E/AndroidRuntime(1106): at libcore.io.IoBridge.recvfrom(IoBridge.java:513)
12-03 05:08:43.022: E/AndroidRuntime(1106): at java.net.PlainSocketImpl.read(PlainSocketImpl.java:488)
12-03 05:08:43.022: E/AndroidRuntime(1106): at java.net.PlainSocketImpl.access$000(PlainSocketImpl.java:46)
12-03 05:08:43.022: E/AndroidRuntime(1106): at java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:240)
12-03 05:08:43.022: E/AndroidRuntime(1106): at org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:103)
12-03 05:08:43.022: E/AndroidRuntime(1106): at org.apache.http.impl.io.AbstractSessionInputBuffer.read(AbstractSessionInputBuffer.java:134)
12-03 05:08:43.022: E/AndroidRuntime(1106): at org.apache.http.impl.io.ContentLengthInputStream.read(ContentLengthInputStream.java:174)
12-03 05:08:43.022: E/AndroidRuntime(1106): at org.apache.http.conn.EofSensorInputStream.read(EofSensorInputStream.java:159)
12-03 05:08:43.022: E/AndroidRuntime(1106): at java.io.InputStreamReader.read(InputStreamReader.java:244)
12-03 05:08:43.022: E/AndroidRuntime(1106): at java.io.BufferedReader.fillBuf(BufferedReader.java:130)
12-03 05:08:43.022: E/AndroidRuntime(1106): at java.io.BufferedReader.readLine(BufferedReader.java:354)
12-03 05:08:43.022: E/AndroidRuntime(1106): at json.JsonDocumnet.Documen(JsonDocumnet.java:200)
12-03 05:08:43.022: E/AndroidRuntime(1106): at activity.Documnet$NetworkDocThread.onPostExecute(Documnet.java:375)
12-03 05:08:43.022: E/AndroidRuntime(1106): at activity.Documnet$NetworkDocThread.onPostExecute(Documnet.java:1)
12-03 05:08:43.022: E/AndroidRuntime(1106): at android.os.AsyncTask.finish(AsyncTask.java:631)
12-03 05:08:43.022: E/AndroidRuntime(1106): at android.os.AsyncTask.access$600(AsyncTask.java:177)
12-03 05:08:43.022: E/AndroidRuntime(1106): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
12-03 05:08:43.022: E/AndroidRuntime(1106): at android.os.Handler.dispatchMessage(Handler.java:99)
12-03 05:08:43.022: E/AndroidRuntime(1106): at android.os.Looper.loop(Looper.java:137)
12-03 05:08:43.022: E/AndroidRuntime(1106): at android.app.ActivityThread.main(ActivityThread.java:5041)
12-03 05:08:43.022: E/AndroidRuntime(1106): at java.lang.reflect.Method.invokeNative(Native Method)
12-03 05:08:43.022: E/AndroidRuntime(1106): at java.lang.reflect.Method.invoke(Method.java:511)
12-03 05:08:43.022: E/AndroidRuntime(1106): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
12-03 05:08:43.022: E/AndroidRuntime(1106): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
12-03 05:08:43.022: E/AndroidRuntime(1106): at dalvik.system.NativeStart.main(Native Method)
我使用的是2 AsynkTask
类,因为我需要在第二类中的第一类的数据,我不能做网络I / O在 onPostExecute
的AsyncTask
。
I'm using 2 AsynkTask
classes because i need the data of the first class in the second class and I cannot do network I/O in onPostExecute
of an AsyncTask
.
编辑////////////////////
EDIT////////////////////
和Documen功能:
and Documen function:
public static DocumentDS Documen(HttpResponse response) throws IOException, JSONException
{
String split[] ;
List<DocumentInfoDS> dslis = new ArrayList<DocumentInfoDS>();
split = response.getStatusLine().toString().split(" ");
for (int i = 0 ; i < split.length ; i++)
{
Log.d("status code is", split[i]);
}
Log.d("status code is", split[1]);
switch (Integer.valueOf(split[1])/100)
{
case 2:
Log.d("IN Switch STATMENT", "2");
in = new BufferedReader(new InputStreamReader(response
.getEntity().getContent()));
StringBuffer sb = new StringBuffer("");
String line = "";
String NL = System.getProperty("line.separator");
while ((line = in.readLine()) != null) {
Log.d("line is", line);
sb.append(line + NL);
}
Log.d("after setting data", "1234");
in.close();
json = sb.toString();
JSONObject jsonObj = new JSONObject(json);
docs = new DocumentDS();
docs.SetDocCount(jsonObj.getInt(TAG_Count));
JSONArray jsonArray = new JSONArray(jsonObj.getString(TAG_Docs));
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject temp = jsonArray.getJSONObject(i);
DocumentInfoDS ds = new DocumentInfoDS();
ds.SetGuId(temp.getString(TAG_Id));
ds.SetTitle(temp.getString(TAG_Title));
ds.SetStateID(temp.getInt(TAG_StateId));
ds.SetCreateDate( temp.getString(TAG_CreateDate));
ds.SetDocumnetNumber(temp.getInt(TAG_DocumentNum));
dslis.add(ds);
}
docs.SetList(dslis);
Log.d("lenght is", String.valueOf(dslis.size()));
break;
}
return docs;
线200,而((行= in.readLine())!= NULL)
line 200 is while ((line = in.readLine()) != null)
推荐答案
您只得到在doInBackground一个Htt的presponse的参考。但所有上的Htt presponse的读/写操作也涉及网络操作。你是从onPOstExecute(HTT presponse)运行在UI线程读取。并尝试这个...
You merely getting a reference of HttpResponse in doInBackground. but all the read/write operations on HttpResponse also involves network operation. and you are reading from HttpResponse in onPOstExecute() which runs in UI Thread. and try this...
public class NetworkDocStateThread extends AsyncTask<String, Void, Void> {
@Override
protected Void doInBackground(String... params) {
try {
HttpResponse responseState = JsonDocumnet
.SendDocumentState(Financial.selectedGuId);
Financial.documnetStateDs = JsonDocumnet
.DocumentState(responseState);
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void post) {
try {
documentStateSpinner.add(Financial.documnetStateDs.get(i)
.getTitle());
SpinnerStateAdapter = new ArrayAdapter<String>(Documnet.this,
R.layout.spinnlayout, R.id.docstateid,
documentStateSpinner);
SpinnerNumAdapter = new ArrayAdapter<String>(Documnet.this,
R.layout.spinnlayout, R.id.docstateid, getResources()
.getStringArray(R.array.numPerPage));
SpinnerSortAdapter = new ArrayAdapter<String>(Documnet.this,
R.layout.spinnlayout, R.id.docstateid, getResources()
.getStringArray(R.array.SortBy));
new NetworkDocThread().execute(Financial.selectedGuId, "5",
"0", "Id", "-1");
docStateSpinner.setAdapter(SpinnerStateAdapter);
NumberPerPageSpinner.setAdapter(SpinnerNumAdapter);
SortBySpinner.setAdapter(SpinnerSortAdapter);
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
super.onPostExecute(post);
}
}
这篇关于android.os.NetworkOnMainThreadException在AsynkTask类的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!