AsyncTask中的IOException

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AsyncTask中的IOException相关的知识,希望对你有一定的参考价值。

我正在尝试使用AsyncTask进行简单的Http请求,这是代码:

public class MainActivity extends Activity implements OnClickListener 


@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Button start = (Button) findViewById(R.id.button1);
    start.setOnClickListener(this);



public void onClick(View v) 


    String url = "http://www.mysamplecode.com/DowloadData";
    new MyAsyncTask(this).execute(url);

  

@Override
public boolean onCreateOptionsMenu(Menu menu) 
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;



public class MyAsyncTask extends AsyncTask<String, Void, String> 

    private static final int REGISTRATION_TIMEOUT = 3 * 1000;
    private static final int WAIT_TIMEOUT = 30 * 1000;
    private final HttpClient httpclient = new DefaultHttpClient();

    final HttpParams params = httpclient.getParams();
    HttpResponse response;
    private String content =  null;
    private boolean error = false;

    private Context mContext;
    private int NOTIFICATION_ID = 1;
    private Notification mNotification;
    private NotificationManager mNotificationManager;

    public MyAsyncTask(Context context)



        this.mContext = context;

        //Get the notification manager
        mNotificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);

    

    protected void onPreExecute() 
        createNotification("Data download is in progress","");
    

    protected String doInBackground(String... urls) 

        String URL = null;
        String param1 = "abc";
        String param2 = "xyz";

        try 

            //URL passed to the AsyncTask
            URL = urls[0];
            HttpConnectionParams.setConnectionTimeout(params, REGISTRATION_TIMEOUT);
            HttpConnectionParams.setSoTimeout(params, WAIT_TIMEOUT);
            ConnManagerParams.setTimeout(params, WAIT_TIMEOUT);


            HttpPost httpPost = new HttpPost(URL);

            //Any other parameters you would like to set
            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
            nameValuePairs.add(new BasicNameValuePair("param1",param1));
            nameValuePairs.add(new BasicNameValuePair("param2",param2));
            httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

            //Response from the Http Request
            response = httpclient.execute(httpPost);

            StatusLine statusLine = response.getStatusLine();
            //Check the Http Request for success
            if(statusLine.getStatusCode() == HttpStatus.SC_OK)
                ByteArrayOutputStream out = new ByteArrayOutputStream();
                response.getEntity().writeTo(out);
                out.close();
                content = out.toString();
            
            else
                //Closes the connection.
                Log.w("HTTP1:",statusLine.getReasonPhrase());
                response.getEntity().getContent().close();
                throw new IOException(statusLine.getReasonPhrase());
            


         catch (ClientProtocolException e) 
            Log.w("HTTP2:",e );
            content = e.getMessage();
            error = true;
            cancel(true);
         catch (IOException e) 
            Log.w("HTTP3:",e );
            content = e.getMessage();
            error = true;
            cancel(true);
        catch (Exception e) 
            Log.w("HTTP4:",e );
            content = e.getMessage();
            error = true;
            cancel(true);
        

        return content;
    

  protected void onCancelled() 
        createNotification("Error occured during data download", content);
    

    protected void onPostExecute(String content) 
        if (error) 
            createNotification("Data download ended abnormally!",content);
         else 
            createNotification("Data download is complete!","");
        
    

    private void createNotification(String contentTitle, String contentText) 

        //Build the notification using Notification.Builder
        Notification.Builder builder = new Notification.Builder(mContext)
        .setSmallIcon(android.R.drawable.stat_sys_download)
        .setAutoCancel(true)
        .setContentTitle(contentTitle)
        .setContentText(contentText);

        //Get current notification
        mNotification = builder.getNotification();

        //Show the notification
        mNotificationManager.notify(NOTIFICATION_ID, mNotification);
    



似乎有效,但是MyAsyncTask总是给出IOException,并且调用了onCancelled()方法,并用错误消息关闭请求,为什么?我怎么解决这个问题?日志(当我捕获到异常时附加到参数“ content”)显示消息“不允许使用方法”,代码中有问题吗?

答案

也许有点晚,但是将您的URL从“ http://www.mysamplecode.com/DowloadData”更改为“ https://www.mysamplecode.com/DowloadData”可以解决。

以上是关于AsyncTask中的IOException的主要内容,如果未能解决你的问题,请参考以下文章

springboot报错说 Failed to parse multipart servlet request; nested exception is java.io.IOException(代码片

Android源代码解析之--&gt;异步任务AsyncTask

Android中的线程状态 - AsyncTask详解

Android面试收集录7 AsyncTask详解

Android源代码解析之--&gt;HandlerThread

替换现有项目中的 Asynctask 无需太多代码更改