Android 为什么我的活动中存在NetworkOnMainThreadException?

Android 为什么我的活动中存在NetworkOnMainThreadException?,android,networkonmainthread,Android,Networkonmainthread,我有一个下载文件的活动,执行该活动一段时间后,我在onPostExecute()上收到一个NetworkOnMainThreadException。此外,该文件未完全下载。我找不到哪里错了。这是我的密码: protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_activity1);

我有一个下载文件的活动,执行该活动一段时间后,我在onPostExecute()上收到一个NetworkOnMainThreadException。此外,该文件未完全下载。我找不到哪里错了。这是我的密码:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_activity1);

    RetrieveFeedTask download = new RetrieveFeedTask();
    download.execute();
}

class RetrieveFeedTask extends AsyncTask<String, Void, InputStream> {

    private Exception exception;

    protected InputStream doInBackground(String... urls) {
        try {
             OkHttpClient client = new OkHttpClient();
                Request request = new Request.Builder()
                  .url(URL)
                  .build();

              Response response = client.newCall(request).execute();
              InputStream asd = response.body().byteStream();
              System.out.println(asd + " vaslisiss");
                          return asd;
        } catch (Exception e) {
            System.out.println("helloooo");
            this.exception = e;;
            return null;
        }
    }

    protected void onPostExecute(InputStream feed) {
        Log.e("mactibiti", "exception", exception); 
        // TODO: do something with the feed
        if(exception == null)
            System.out.println("asdasdasdasdasdasdads");
        try{
        File file = new File(Environment.getExternalStorageDirectory() + "/downloaded_file.xml");
        FileOutputStream fileOutput = new FileOutputStream(file);
        byte[] buffer = new byte[1024];
        int bufferLength = 0;

        while ( (bufferLength = feed.read(buffer)) > 0 ) {
            fileOutput.write(buffer, 0, bufferLength);
        }
        //close the output stream when complete //
        fileOutput.close();
        feed.close();
        }
        catch(Exception e){
            Log.e("filex", "ioexc", e);
        }

    }
}}
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u activity1);
RetrieveFeedTask下载=新建RetrieveFeedTask();
下载.execute();
}
类RetrieveFeedTask扩展了AsyncTask{
私人例外;
受保护的InputStream doInBackground(字符串…URL){
试一试{
OkHttpClient=新的OkHttpClient();
Request Request=newrequest.Builder()
.url(url)
.build();
Response=client.newCall(request.execute();
InputStream asd=response.body().ByTestStream();
System.out.println(asd+“Vasliss”);
返回asd;
}捕获(例外e){
System.out.println(“hellooooo”);
这个例外=e;;
返回null;
}
}
受保护的void onPostExecute(InputStream提要){
Log.e(“mactibiti”,“exception”,exception);
//TODO:对提要做些什么
if(异常==null)
System.out.println(“asdasdads”);
试一试{
File File=新文件(Environment.getExternalStorageDirectory()+“/downloaded_File.xml”);
FileOutputStream fileOutput=新的FileOutputStream(文件);
字节[]缓冲区=新字节[1024];
int bufferLength=0;
而((bufferLength=feed.read(buffer))>0){
fileOutput.write(buffer,0,bufferLength);
}
//完成后关闭输出流//
fileOutput.close();
feed.close();
}
捕获(例外e){
Log.e(“filex”、“ioexc”、e);
}
}
}}

feed
是您正在从Http调用读取的
InputStream
将该代码移动到
doInBackground()
您仍在使用网络读取数据如果我理解正确,feed在doInBackground()之后仍与internet连接?所以我必须把保存文件的代码放在doInBackGround()上,对吗?@billiout这是正确的。您在
doInBackground()
方法中获得了流,但该流在
onPostExecute()
@billiout()期间仍在从internet读取。是的,您必须
protected void onPostExecute(InputStream feed) {