1,第一种:在主程序中增加一下语句
@SuppressLint("NewApi")
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//可以在主线程访问网络
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectDiskReads()
.detectDiskWrites()
.detectNetwork() // or .detectAll() for all detectable problems
.penaltyLog()
.build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects()
.detectLeakedClosableObjects()
.penaltyLog()
.penaltyDeath()
.build());
//访问webservice或者其他语句
}
2,第二种方法:是启动线程访问:
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 启动线程
new Thread(getdb).start();
}
/**
* 线程访问
*/
Runnable getdb= new Runnable()
{
@Override
public void run()
{
Looper.prepare();
//访问webservice或者其他语句 此处是获取网络数据的地方如:weiservice数据
// 必须使用post方法更新UI组件
//resultView是我页面的一个TextView 更新显示内容如下:
resultView.post(new Runnable()
{
@Override public void run()
{
resultView.setText(result);
}
});
Looper.loop();
}
};
第三种:和第二种类似用系统提供的AsyncTask
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 异步执行调用WebService的任务
new myAsyncTask().execute();
}
class myAsyncTask extends AsyncTask
{
@Override
protected Object doInBackground(Object... params)
{
//访问webservice或者其他语句 此处是获取网络数据的地方如:weiservice数据
//更新控件显示的内容
resultView.post(new Runnable()
{
@Override
public void run()
{
//result假定是返回值
resultView.setText(result);
}
});
return null;
}
}
Android 中从4.0以后无法在主线程访问网络的解决办法。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.