public static NetHelper
{
public static getVersion()
{
int version = getNetVersion();//这里从网络上取得网上的版本
}
}
上面的类在线程中调用是没有问题的,但在主线程调用就会出错
因为这个GetVersion是要访问网络的
Android4.0 以后不允许在主线程进行网络连接,否则会出现 android.os.NetworkOnMainThreadException那在不更改主线程业务的情况下,
如何修改这个GetVersion方法,让他可以在主线程,也可以在子线程中调用呢?万分感谢
解决方案 »
- Andriod开发经验讨论
- Android:TextView:同时调用setLines与setMaxLines(或者setLines与setMinLines)方法均有问题
- 为什么我手动安装的APK无法运行
- Android如何播放Buffer里的PCM音频数据?
- 如何让背景居中显示
- listView中应用imageButton
- android 如何通过程序访问 nand内存
- 至急,在百度地图的定位点上画icon的问题,在线等!!!
- android GridView刷新后 怎么让数据从第一项开始显示
- 一个定位的问题
- 去除自启动应用的问题
- WebView在4.2上有时是空白界面??在2.3上是可以的
----------------------------
这些我会
问题是如果我用了new Thread + handler 的话
我的
publi static int GetNetVersion()
{
new Thread(new Runable(){ ... }).start();
return ??? 这样的话我这个方法就没有办法返回啊
}
谢谢
获取到version以后,不是要return,是要发个消息,然后用handler处理这个消息:弹出提示啊什么的都随便你做了。
@Override
public void run() {
super.run();
NetHelper.getVersion(); Message message = new Message();
Bundle bundle = new Bundle();// 存放数据
message.setData(bundle);
message.what = 0;
handler.sendMessage(message);
}
}.start(); private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == 0) {
//do something
}
}
};
楼上的方法我会,但问题是本来我这里只是一个简单的方法返回一个int数值
就得用Handle来发消息处理,本来很简单的业务逻辑如
如主线程取得网络版本号:int version = NetHelper.GetNetVersion();
现在就得把在NetHelper里面做Thread + Handle
然后,还得在NetHelper加个监听
在调用的地方还得写个回调如:
NetHelper helper = new NetHelper();
helper.setOnVersionResult = new setOnVersionResult(){
public void Result(int netVersion)
{
...在这里在进行backback 播放
}
}
-------------------------
这样不是好麻烦啊
本来我想的办法是用Countdownlatch来等待返回,但这样又会改成应用崩溃一个简单的业务,就没有简单点的办法了吗?
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.logins);//就是将下面的代码加入到里面,activity主线程就可以访问网络了。
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectDiskReads()
.detectDiskWrites()
.detectNetwork() // or .detectAll() for all detectable problems
.penaltyLog()
.build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects()
.penaltyLog()
.penaltyDeath()
.build());
楼上的方法我会,但问题是本来我这里只是一个简单的方法返回一个int数值
就得用Handle来发消息处理,本来很简单的业务逻辑如
如主线程取得网络版本号:int version = NetHelper.GetNetVersion();
现在就得把在NetHelper里面做Thread + Handle
然后,还得在NetHelper加个监听
在调用的地方还得写个回调如:
NetHelper helper = new NetHelper();
helper.setOnVersionResult = new setOnVersionResult(){
public void Result(int netVersion)
{
...在这里在进行backback 播放
}
}
-------------------------
这样不是好麻烦啊
本来我想的办法是用Countdownlatch来等待返回,但这样又会改成应用崩溃一个简单的业务,就没有简单点的办法了吗?
简单是简单 但是网络出了问题你就后悔吧 anr妥妥的