【问题标题】:android os network on main thread exception主线程异常上的android os网络
【发布时间】: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 multithreading exception main


【解决方案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);
                }
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-10-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-07-05
          • 2013-06-29
          相关资源
          最近更新 更多