简体   繁体   English

AsyncTask内的Android:NetworkOnMainThreadException错误

[英]Android:NetworkOnMainThreadException error inside AsyncTask

okay so i created a inner class which extends AsycTask in order for my code to run outwith the UI thread. 好的,所以我创建了一个内部类,该类扩展了AsycTask,以便我的代码与UI线程一起运行。 However i'm getting this error so i assume this means some part of my onPostExecute needs to be done in doInBackground however i cant figure out exactly what this is 但是我收到此错误,所以我认为这意味着我的onPostExecute的某些部分需要在doInBackground中完成,但是我无法弄清楚这到底是什么

public class asyncTask extends AsyncTask<String, Integer, String> {

        ProgressDialog dialog = new ProgressDialog(PetrolPriceActivity.this);

        @Override
           protected void onPreExecute() {
          dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
          dialog.setProgress(0);
          dialog.setMax(100);
          dialog.setMessage("loading...");
          dialog.show();
           }

         @Override
           protected String doInBackground(String...parmans){
                {

                    for(int i = 0; i < 100; i++){


                        publishProgress(1);
                        try {
                            Thread.sleep(100);
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }

                    }


                    String urlString = petrolPriceURL;
                    String result = "";
                    InputStream anInStream = null;
                    int response = -1;
                    URL url = null;

                    try {
                        url = new URL(urlString);
                    } catch (MalformedURLException e) {
                        // TODO Auto-generated catch block
                        return null;
                    }
                    URLConnection conn = null;
                    try {
                        conn = url.openConnection();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        return null;
                    }

                    // Check that the connection can be opened
                    if (!(conn instanceof HttpURLConnection))
                        try {
                            throw new IOException("Not an HTTP connection");
                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            return null;
                        }
                    try
                    {
                        // Open connection
                        HttpURLConnection httpConn = (HttpURLConnection) conn;
                        httpConn.setAllowUserInteraction(false);
                        httpConn.setInstanceFollowRedirects(true);
                        httpConn.setRequestMethod("GET");
                        httpConn.connect();
                        response = httpConn.getResponseCode();
                        // Check that connection is OK
                        if (response == HttpURLConnection.HTTP_OK)
                        {
                            // Connection is OK so open a reader 
                            anInStream = httpConn.getInputStream();
                            InputStreamReader in= new InputStreamReader(anInStream);
                            BufferedReader bin= new BufferedReader(in);

                            // Read in the data from the RSS stream
                            String line = new String();
                            while (( (line = bin.readLine())) != null)
                            {
                                result = result + "\n" + line;
                            }
                        }
                    }
                    catch (IOException ex)
                    {
                            try {
                                throw new IOException("Error connecting");
                            } catch (IOException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                    }

            return result;

                }
           }
           @Override

           protected void onProgressUpdate(Integer...progress){

               dialog.incrementProgressBy(progress[0]);
           }

           @Override
           protected void onPostExecute(String result) {
               // Get the data from the RSS stream as a string

               errorText = (TextView)findViewById(R.id.error);
               response = (TextView)findViewById(R.id.title);

               try
                {
                    // Get the data from the RSS stream as a string
                    result =  doInBackground(petrolPriceURL);
                    response.setText(result);
                    Log.v(TAG, "index=" + result);
                }
                catch(Exception ae)
                {
                    // Handle error
                    errorText.setText("Error");
                    // Add error info to log for diagnostics
                    errorText.setText(ae.toString());
                } 
                if(dialog.getProgress() == dialog.getMax())
                dialog.dismiss();

           }
        }

if someone could point out my error as well as show an example of where the code is suppose to go in my doInBackground that would be great. 如果有人可以指出我的错误以及显示代码应该放在doInBackground中的示例,那将很棒。 Thanks 谢谢

problem: 问题:

result =  doInBackground(petrolPriceURL);

you are implicitly calling the doInbackground method in the onPostExecute which will actually run in your UI thread instead on a different thread thus resulting to Android:NetworkOnMainThreadException . 你是隐式调用doInbackground的方法onPostExecute这将在实际UI线程,而不是在不同的线程从而导致运行Android:NetworkOnMainThreadException

Also it is unnecessary to call doInBackground that it is already executed before onPostExecute when you execute your Asynctask . 此外,它不需要调用doInBackground它之前已经执行onPostExecute当您执行Asynctask Just directly use the result parameter of the onPostExecute . 只需直接使用result的参数onPostExecute

sample: 样品:

@Override
       protected void onPostExecute(String result) {
           // Get the data from the RSS stream as a string

           errorText = (TextView)findViewById(R.id.error);
           response = (TextView)findViewById(R.id.title);

            response.setText(result);

            if(dialog.getProgress() == dialog.getMax())
            dialog.dismiss();

       }

I suspect the error is related to this part of your code: 我怀疑该错误与您的代码的这一部分有关:

try
 {
 // Get the data from the RSS stream as a string
 result =  doInBackground(petrolPriceURL);
 response.setText(result);
 Log.v(TAG, "index=" + result);
 }

doInBackgound is called automatically when you call asynctask.execute. 当您调用asynctask.execute时,会自动调用doInBackgound。 To start your task correctly you should (1) create a new instance of your task; 要正确启动任务,您应该(1)创建任务的新实例; (2) pass the string params you need to use in doInBackground in the execute method; (2)在execute方法中的doInBackground中传递您需要使用的字符串参数; (3) use them; (3)使用它们; (4) return the result to onPostExecute. (4)将结果返回给onPostExecute。

For Example: 例如:

 //in your activity or fragment
 MyTask postTask = new MyTask();
 postTask.execute(value1, value2, value3);

 //in your async task
 @Override
 protected String doInBackground(String... params){

      //extract values
      String value1 = params[0];
      String value2 = params[1];
      String value3 = params[2];

      // do some work and return result
      return value1 + value2;
 }

 @Override
 protected void onPostExecute(String result){

      //use the result you returned from you doInBackground method
 }

You should try to do all of your "work" in the doInBackground method. 您应该尝试在doInBackground方法中完成所有“工作”。 Reutrn the result you want to use on the main/UI thread. 返回要在主/ UI线程上使用的结果。 This will automaticlly be passed as an argument to the onPostExecute method (which runs on the main/UI thread). 这将自动作为参数传递给onPostExecute方法(在主/ UI线程上运行)。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM