AsynkTask类中的android.os.NetworkOnMainThreadException
我想通过AsynkTask类中的android.os.NetworkOnMainThreadException,android,android-asynctask,Android,Android Asynctask,我想通过JSON从互联网上获取数据,我正在使用AsynkTask类来完成这项工作,但如果我添加或更改任何 编码并再次运行我的程序它将停止与android.os.NetworkOnMainThreadException一起工作 但是我从来没有在主线程上运行过此代码,我必须单击修复项目,然后清理项目并再次运行,它再次正常工作,这是什么问题? 我的代码如下所示: public class NetworkDocStateThread extends AsyncTask<String, Vo
JSON
从互联网上获取数据,我正在使用AsynkTask
类来完成这项工作,但如果我添加或更改任何
编码并再次运行我的程序它将停止与android.os.NetworkOnMainThreadException一起工作
但是我从来没有在主线程上运行过此代码,我必须单击修复项目
,然后清理项目并再次运行,它再次正常工作,这是什么问题?
我的代码如下所示:
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);
}
}
我使用2个AsynkTask
类,因为我需要第二个类中第一个类的数据,并且我无法在AsyncTask
的onPostExecute
中执行网络I/O
编辑////////////////////
和文档功能:
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;
publicstaticdocumentsddocumen(HttpResponse响应)抛出IOException、jsoneexception
{
字符串拆分[];
List dslis=new ArrayList();
split=response.getStatusLine().toString().split(“”);
对于(int i=0;i
第200行是while((line=in.readLine())!=null)尝试在onCreate(Bundle)上添加以下代码
您仅在doInBackground中获取HttpResponse的引用。但HttpResponse上的所有读/写操作也涉及网络操作。您正在UI线程中运行的onPOstExecute()中读取HttpResponse。请尝试以下操作
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);
}
}
公共类NetworkDocStateThread扩展异步任务{
@凌驾
受保护的Void doInBackground(字符串…参数){
试一试{
HttpResponse responseState=JsonDocumnet
.SendDocumentState(Financial.selectedGuId);
Financial.documnetstates=JsonDocumnet
.文件州(不动产);
}捕获(例外情况除外){
例如printStackTrace();
}
返回null;
}
@凌驾
受保护的void onPostExecute(void post){
试一试{
documentStateSpinner.add(Financial.documnetstates.get(i)
.getTitle());
SpinnerStateAdapter=新阵列适配器(Documnet.this,
R.layout.spinnlayout,R.id.docstateid,
(旋转器);
SpinnerNumAdapter=新阵列适配器(Documnet.this,
R.layout.spinnlayout、R.id.docstateid、getResources()
.getStringArray(R.array.numPerPage));
SpinnerSortAdapter=新阵列适配器(Documnet.this,
R.layout.spinnlayout、R.id.docstateid、getResources()
.getStringArray(R.array.SortBy));
新建NetworkDocThread().execute(Financial.selectedGuId,“5”,
“0”、“Id”、“-1”);
setAdapter(SpinnerStateAdapter);
NumberPerPageSpinner.setAdapter(SpinnerNumAdapter);
设置适配器(喷丝头或适配器);
}捕获(非法状态){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}捕获(JSONException e){
e、 printStackTrace();
}
super.onPostExecute(post);
}
}
当您在主线程中执行网络连接任务(如从服务器获取数据)时,就会出现此问题。建议在AsyncTask
的doInbackground()
方法中执行此类任务,或者您也可以通过将下面的代码放在活动的onCreate()
中来避免此问题:
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
.permitAll().build();
StrictMode.setThreadPolicy(policy);
我希望当您已经在主线程中编写了大量代码时,它能解决您的问题。清单文件中的Internet权限?您是否授予Internet权限?这有什么作用jsondocument.DocumentState(responseState)
?是的,如果我添加了该权限,请参阅我的Edit@Raghunandan读jason并写进Object这对我有什么作用?尝试添加它,这将处理异步任务进程。添加它并运行code@user406090这不是解决方案。应该将n/w相关操作移动到线程。实际上我已经遇到了这个问题,我将此代码放在后面,然后异步任务没有问题,测试时应该使用@user406090。要读取,必须从响应中获取InputStream。流中的数据来自网络。因此,读取涉及网络操作
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;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
.permitAll().build();
StrictMode.setThreadPolicy(policy);
//your code
}
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);
}
}
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
.permitAll().build();
StrictMode.setThreadPolicy(policy);