android networkonmainthreadexception 异常的解决办法

本文介绍如何避免在Android应用中因主线程执行网络操作而引发的NetworkOnMainThreadException异常。通过设置StrictMode策略来检测不当的网络调用,并提供了一个使用AsyncTask实现图片异步上传的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上传图片的时候会弹出networkonmainthreadexception的异常,原因是在主线程中不能有其他的进行网络请求的操作,为了避免主线程出现假死的情况

 

1.利用代码直接写入在onCreate下面的setContentView(parentView);的下面

StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
    .detectDiskReads().detectDiskWrites().detectNetwork()
    .penaltyLog().build());
  StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
    .detectLeakedSqlLiteObjects().penaltyLog().penaltyDeath()
    .build());

导入包即可

2.使用AsyncTask异步上传

 for(int i=0;i<size;i++)
      {
          path=Bimp.tempSelectBitmap.get(i).getImagePath();
       
          myAsyncTask ma=new myAsyncTask(internal_photoName, path, MainActivity.this);
          ma.execute(100);
      }

 

//创建一个类

class myAsyncTask extends AsyncTask<Integer, Integer, String>{

 String _internal_photoName;
 String _path;
 Context _context;
 public myAsyncTask(String internal_photoName,String path,Context context)
 {
  _internal_photoName=internal_photoName;
  _path=path;
  _context=context;
  
 }
 @Override
 protected void onPreExecute() {
  // TODO Auto-generated method stub
  super.onPreExecute();
 }
 @Override
 protected String doInBackground(Integer... params) {
  // 已经选择好图片,上传图片
  Date date = new Date();
  _internal_photoName = date.getTime() / 1000+ "_activity" +".jpg";
  String ftpUpload = FtpUploadUtil.ftpUpload(
    FTPConstz.url,  FTPConstz.port,
    FTPConstz.username, FTPConstz.password,
    FTPConstz.huodong_internal_path,
    _path, "", _internal_photoName);
  
  System.out.println("值         "+ftpUpload);
  if(ftpUpload.equals("1")){
//   post_load();
//   Toast.makeText(_context, "上传成功!", Toast.LENGTH_SHORT).show();
  }else{
   Toast.makeText(_context, "上传失败!", Toast.LENGTH_SHORT).show();
  }
  return "上传成功!";
 }
 @Override
 protected void onPostExecute(String result) {
  // TODO Auto-generated method stub
  super.onPostExecute(result);
  Log.e("","result="+result);
  Toast.makeText(_context, ""+result, Toast.LENGTH_SHORT).show();
  
 }
 
 
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

A HandSome Man

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值