我让这个代码在单个应用程序中工作,但如果与其他应用程序连接,则显示这个对话框"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优先级队列。它们使在服务中执行任务变得异常容易。