android操作系统网络主线程异常



我让这个代码在单个应用程序中工作,但如果与其他应用程序连接,则显示这个对话框"android操作系统网络主线程异常"

 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);  
           }


      });
      }   
}

在权限中,我激活<uses-permission android:name="android.permission.INTERNET"/>并且仍然不工作

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

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

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

你也可以在这里参考Android异步任务

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);
        }
    }
first method 

您可以创建一个AsynTask。。您的代码应该在后台运行,以便做出响应。。否则将显示"未响应"。。

Second Method

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

Third 

setContentView 之后对onCreate中的代码进行右键操作

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

虽然这个线程中发布的所有答案都是正确的,但异步任务不再是用户进行网络事务的好工具。造成这种情况的主要原因是异步任务与活动密切相关,所以会出现很多问题,比如。。。"如果在网络调用返回之前活动被破坏,会发生什么?"。

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

我建议查看Path FOSS项目android优先级队列。它们使在服务中执行任务变得异常容易。

相关内容

  • 没有找到相关文章

最新更新