主线程异常上的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); );
在我允许<uses-permission android:name="android.permission.INTERNET"/>
还是不行
【问题讨论】:
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
对onCreate
中setContentView
后的代码进行修改
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之后谷歌强制要求连接网络不能在主线程进行访问