主线程异常上的android os网络

Posted

技术标签:

【中文标题】主线程异常上的android os网络【英文标题】:android os network on main thread exception 【发布时间】:2013-06-26 06:46:42 【问题描述】:

我让这个代码在单个应用程序中工作,但如果加入其他应用程序,显示此对话框“android os network on main thread exception”

 package com.kelompok2.bissmilahpulsa;
    import java.util.ArrayList;
    import org.apache.http.NameValuePair;
    import org.apache.http.message.BasicNameValuePair;
    import android.net.Uri;
    import android.os.Bundle;
    import android.app.Activity;
    import android.content.Intent;
    import android.view.Menu;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.RadioGroup;
    import android.widget.TextView;

    public class coba extends Activity 
      EditText nm,nmr;
      RadioGroup prov,nom,pem;
      TextView error;
      Button ok;

      @Override

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

      nm=(EditText)findViewById(R.id.et_nama);
      nmr=(EditText)findViewById(R.id.et_nomor);
      prov=(RadioGroup)findViewById(R.id.provider);
      nom=(RadioGroup)findViewById(R.id.nominal);
      error=(TextView)findViewById(R.id.error);
      pem=(RadioGroup)findViewById(R.id.pembayaran);
      ok=(Button)findViewById(R.id.btn_ok);

      ok.setOnClickListener(new View.OnClickListener() 

          @Override
          public void onClick(View v) 
              // TODO Auto-generated method stub
              String type=null;
               String type1=null;
               String type2=null;
               switch (prov.getCheckedRadioButtonId()) 
               
               case R.id.rb_as:
               type="As";
               break;
               case R.id.rb_axis:
               type="Axis";
               break;
               case R.id.rb_im3:
               type="Im3";
               break;
               case R.id.rb_telkomsel:
               type="Telokmsel";
               break;
               case R.id.rb_xl:
               type="Xl";
               break;
               
               switch (nom.getCheckedRadioButtonId()) 
               
               case R.id.rb_5:
               type1="5";
               break;
               case R.id.rb_10:
               type1="10";
               break;
               case R.id.rb_20:
               type1="20";
               break;
               case R.id.rb_50:
               type1="50";
               break;
               
               switch (pem.getCheckedRadioButtonId()) 
               
               case R.id.rb_cash:
               type2="Cash";
               break;
               case R.id.rb_hutang:
               type2="Hutang";
               break;
               

              ArrayList<NameValuePair> postParameters = new ArrayList<NameValuePair>();
              postParameters.add(new BasicNameValuePair("nama", nm.getText().toString()));
              postParameters.add(new BasicNameValuePair("nomor", nmr.getText().toString()));
              postParameters.add(new BasicNameValuePair("provider", type));
              postParameters.add(new BasicNameValuePair("nominal", type1));
              postParameters.add(new BasicNameValuePair("jenis_pembayaran", type2));
              String response = null;

              try 

                 response = CustomHttpClient.executeHttpPost("http://appmob.pusku.com/save.php", postParameters);

                 String res = response.toString();

                 res = res.trim();

                 res = res.replaceAll("\\s+","");

                 error.setText(res);

                 if (res.equals("1")) error.setText("Data Tersimpan");

                 else error.setText("Data Tersimpan Ke server");

              

              catch (Exception e) 

                 error.setText(e.toString());

              

              String nama1 = nm.getText().toString();
              String nama2 = nmr.getText().toString();
              String nama3 = type;
              String nama4 = type1;
              String nama5 = type2;

             String sms = nama1+"#"+nama2+"#"+nama3+"#"+nama4+"#"+nama5;

                      Intent    i = new Intent (Intent.ACTION_SENDTO,Uri.parse("sms:5556"));
                          i.putExtra("sms_body", sms);
                          startActivity(i); 

                                  nm.setText(null);
                                  nmr.setText(null);  

           




      );

         

在我允许&lt;uses-permission android:name="android.permission.INTERNET"/&gt; 还是不行

【问题讨论】:

android.os.NetworkOnMainThreadException的可能重复 【参考方案1】:

您需要在独立于主 (UI) 线程的线程上运行互联网活动,您可以通过将代码包装在以下块中来实现:

new Thread() 
    @Override
    public void run() 
       //your code here
    
.start();

【讨论】:

【参考方案2】:

虽然此线程中发布的所有答案都是正确的,但 asynctasks 并没有真正考虑成为用户进行网络事务的好工具。主要原因是异步任务与活动密切相关,因此出现了很多问题,例如......“如果活动在网络调用返回之前被销毁会发生什么?”。

如果您真的想实现 android 最佳实践(更不用说给您的 Android 开发人员留下深刻印象),那么为什么不在服务中执行网络任务呢?

我建议查看 Path FOSS 项目android-prioriy-queue。它们使在服务中执行任务变得非常容易。

【讨论】:

【参考方案3】:
first method 

你可以创建一个 AsynTask .. 你的代码应该在后台运行以便响应.. 否则它将显示 Not Responding ..

Second Method

您可以为它创建一个单独的线程......使用多任务处理。

Third 

onCreatesetContentView后的代码进行修改

 StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);

【讨论】:

【参考方案4】:

在 AsyncTask 中执行与网络相关的操作

您也可以参考这里Android AsyncTask

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

        @Override
        protected void onPreExecute() 
            // TODO Auto-generated method stub
            /**
             * show dialog
             */
            super.onPreExecute();
        

        @Override
        protected String doInBackground(Void... params) 
            // TODO Auto-generated method stub
            /**
             * Do network related stuff
             * return string response.
             */
            return null;
        

        @Override
        protected void onPostExecute(String result) 
            // TODO Auto-generated method stub
            /**
             * update ui thread and remove dialog
             */
            super.onPostExecute(result);
        
    

【讨论】:

以上是关于主线程异常上的android os网络的主要内容,如果未能解决你的问题,请参考以下文章

android.os.NetworkOnMainThreadException异常处理

android.os.NetworkOnMainThreadException 在4.0之后谷歌强制要求连接网络不能在主线程进行访问

android.os.NetworkOnMainThreadException

Android子线程访问网络

Android Handler

Android 主线程(UI线程)的理解