您的位置:首页 > 理论基础 > 计算机网络

Android 中从4.0以后无法在主线程访问网络的解决办法。

2013-11-27 14:44 387 查看
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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐