Android应用程序的工作原理在3G上,但不是在无线网络 [英] Android app works on 3g but not in wi-fi

查看:146
本文介绍了Android应用程序的工作原理在3G上,但不是在无线网络的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个活动(MainActivity),它应该做的我与服务器的版本检查,并允许用户登录到帐户。问题是,无论是功能使用网络连接(obvously),他们用3G连接工作,但我尝试使用WiFi连接的应用程序将引发NetworkOnMainThread异常。在更加奇怪的事情(至少对我来说)是,这个问题仅出现在本次活动中,所有其他活动都可以访问3G和wifi和它们使用相同的类的MainActivity。怎么会这样?

MainActivity:

 公共类MainActivity扩展活动实现OnTaskCompleted {

    @覆盖
    保护无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.main_activity);

        尝试 {
            版本= Float.parseFloat(getApplicationContext()。getPackageManager()。
                    getPackageInfo(getApplicationContext()getPackageName(),0).versionName);
        }赶上(NumberFormatException异常E){
            // TODO自动生成的catch块
            e.printStackTrace();
        }赶上(的NameNotFoundException E){
            // TODO自动生成的catch块
            e.printStackTrace();
        }

        如果(!isOnline()){
            // prevent用户走得更远
        }其他{
            字符串URL =/ * MYDOMAIN * // version_check.php;
            PostRequest后=新PostRequest(URL,空,MainActivity.this,版本);
            post.execute(URL);
        }

        //登录code
    }

    @覆盖
    公共无效onTaskCompleted(对象RETURN_VALUE,字符串类型){
        如果(type.equals(版本)){
            最新浮= Float.parseFloat((字符串)RETURN_VALUE);
            如果(版本<最新的){
                AlertDialog.Builder alertDialogBu​​ilder =新AlertDialog.Builder(MainActivity.this);
                 alertDialogBu​​ilder.setMessage(更新的应用程序!);
                    alertDialogBu​​ilder.setNegativeButton(不是现在,新DialogInterface.OnClickListener(){
                        公共无效的onClick(DialogInterface对话框,INT ID){
                            //如果单击此按钮,关闭
                            //当前活动
                            完();
                        }
                      });
                    alertDialogBu​​ilder.setPositiveButton(立即更新!,新DialogInterface.OnClickListener(){
                            公共无效的onClick(DialogInterface对话框,INT ID){
                                //如果单击此按钮,关闭
                                //当前活动
                                //去playstore
                            }
                          });

                        //创建警报对话框
                        alertDialog = alertDialogBu​​ilder.create();
                        alertDialog.show();
            }
        }
        如果(type.equals(登录)){
            //登录响应处理


    }

    公共布尔isOnline(){
        ConnectivityManager厘米=(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
        的NetworkInfo的NetInfo = cm.getActiveNetworkInfo();
        如果(NetInfo的= NULL和放大器;!&安培; netInfo.isConnectedOrConnecting()){
            返回true;
        }
        返回false;
    }

}
 

PostRequest code: 公共类PostRequest扩展的AsyncTask {

 私人HttpClient的客户端;
私人HttpPost请求;
公共字符串结果,类型;
私人OnTaskCompleted监听;
公众的Htt presponse响应;

公共PostRequest(字符串URL,列表和LT;的NameValuePair> namevaluepairs中,OnTaskCompleted监听器,字符串类型){
    this.client =新DefaultHttpClient();
    this.request =新HttpPost(URL);
    this.listener =侦听器;
    this.type =类型;



    尝试 {
        如果(namevaluepairs中!= NULL)
            request.setEntity(新UrlEn codedFormEntity(namevaluepairs中));
    }赶上(UnsupportedEncodingException E){
        // TODO自动生成的catch块
        e.printStackTrace();
    }
    }


@覆盖
受保护的Htt presponse doInBackground(字符串... PARAMS){

    尝试 {

        响应= client.execute(要求);
        状态行状态行= response.getStatusLine();
        如果(statusLine.getStatus code()== HttpStatus.SC_OK){

        }
    }赶上(ClientProtocolException E){
        // TODO自动生成的catch块
        e.printStackTrace();
    }赶上(IOException异常E){
        // TODO自动生成的catch块
        e.printStackTrace();
    }

    返回响应;
}

@覆盖
保护无效onPostExecute(Htt的presponse结果){
            //如果响应中不包含一个JSON
    如果(type.equals(mod_database)|| type.equals(版本)|| type.equals(推)){
        ByteArrayOutputStream OUT =新ByteArrayOutputStream();
        OUT =新ByteArrayOutputStream();
        尝试 {
            。response.getEntity()的writeTo(出);
        }赶上(IOException异常E){
            // TODO自动生成的catch块
            e.printStackTrace();
        }
        如果(听众!= NULL)
            listener.onTaskCompleted(out.toString(),类型);
        返回;
    }
        //响应包含JSON
    ReadJson jsonR =新ReadJson(类型);
    对象物obj = jsonR.read(响应);
    listener.onTaskCompleted(OBJ,类型);
}
 

}

堆栈跟踪:

  02-20 17:15:57.305:E / AndroidRuntime(13460):致命异常:主要
02-20 17:15:57.305:E / AndroidRuntime(13460):android.os.NetworkOnMainThreadException
02-20 17:15:57.305:E / AndroidRuntime(13460):在android.os.StrictMode $ AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1118)
02-20 17:15:57.305:E / AndroidRuntime(13460):在libcore.io.BlockGuardOs.recvfrom(BlockGuardOs.java:163)
02-20 17:15:57.305:E / AndroidRuntime(13460):在libcore.io.IoBridge.recvfrom(IoBridge.java:513)
02-20 17:15:57.305:E / AndroidRuntime(13460):在java.net.PlainSocketImpl.read(PlainSocketImpl.java:488)
02-20 17:15:57.305:E / AndroidRuntime(13460):在java.net.PlainSocketImpl.access $ 000(PlainSocketImpl.java:46)
02-20 17:15:57.305:E / AndroidRuntime(13460):在java.net.PlainSocketImpl $ PlainSocketInputStream.read(PlainSocketImpl.java:240)
02-20 17:15:57.305:E / AndroidRuntime(13460):在org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:103)
02-20 17:15:57.305:E / AndroidRuntime(13460):在org.apache.http.impl.io.AbstractSessionInputBuffer.readLine(AbstractSessionInputBuffer.java:191)
02-20 17:15:57.305:E / AndroidRuntime(13460):在org.apache.http.impl.io.ChunkedInputStream.getChunkSize(ChunkedInputStream.java:220)
02-20 17:15:57.305:E / AndroidRuntime(13460):在org.apache.http.impl.io.ChunkedInputStream.nextChunk(ChunkedInputStream.java:183)
02-20 17:15:57.305:E / AndroidRuntime(13460):在org.apache.http.impl.io.ChunkedInputStream.read(ChunkedInputStream.java:155)
02-20 17:15:57.305:E / AndroidRuntime(13460):在org.apache.http.impl.io.ChunkedInputStream.read(ChunkedInputStream.java:175)
02-20 17:15:57.305:E / AndroidRuntime(13460):在org.apache.http.entity.BasicHttpEntity.writeTo(BasicHttpEntity.java:129)
02-20 17:15:57.305:E / AndroidRuntime(13460):在org.apache.http.entity.HttpEntityWrapper.writeTo(HttpEntityWrapper.java:101)
02-20 17:15:57.305:E / AndroidRuntime(13460):在org.apache.http.conn.BasicManagedEntity.writeTo(BasicManagedEntity.java:126)
02-20 17:15:57.305:E / AndroidRuntime(13460):在it.stepapp.clienti.PostRequest.onPostExecute(PostRequest.java:78)
02-20 17:15:57.305:E / AndroidRuntime(13460):在it.stepapp.clienti.PostRequest.onPostExecute(PostRequest.java:1)
02-20 17:15:57.305:E / AndroidRuntime(13460):在android.os.AsyncTask.finish(AsyncTask.java:631)
02-20 17:15:57.305:E / AndroidRuntime(13460):在android.os.AsyncTask.access $ 600(AsyncTask.java:177)
02-20 17:15:57.305:E / AndroidRuntime(13460):在android.os.AsyncTask $ InternalHandler.handleMessage(AsyncTask.java:644)
02-20 17:15:57.305:E / AndroidRuntime(13460):在android.os.Handler.dispatchMessage(Handler.java:99)
02-20 17:15:57.305:E / AndroidRuntime(13460):在android.os.Looper.loop(Looper.java:137)
02-20 17:15:57.305:E / AndroidRuntime(13460):在android.app.ActivityThread.main(ActivityThread.java:4856)
02-20 17:15:57.305:E / AndroidRuntime(13460):在java.lang.reflect.Method.invokeNative(本机方法)
02-20 17:15:57.305:E / AndroidRuntime(13460):在java.lang.reflect.Method.invoke(Method.java:511)
02-20 17:15:57.305:E / AndroidRuntime(13460):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1007)
02-20 17:15:57.305:E / AndroidRuntime(13460):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774)
02-20 17:15:57.305:E / AndroidRuntime(13460):在dalvik.system.NativeStart.main(本机方法)
 

解决方案

 致命异常:主要
android.os.NetworkOnMainThreadException

在it.stepapp.clienti.PostRequest.onPostExecute(PostRequest.java:78)
在it.stepapp.clienti.PostRequest.onPostExecute(PostRequest.java:1)
 

不要onPostExecute()做网络的操作,运行在主线程。

无论你正在做PostRequest.java线78(您可以识别,我们不能)最终是一个网络操作。你需要做的,在doInBackground()方法。

I've an activity (MainActivity) that is supposed to do a version check of my up with a server and allow the users to login into accounts. the problem is that both the functions use network connection (obvously), they work with a 3g connection but i try to use a wifi connection the app throws NetworkOnMainThread exception. the even more strange thing (to me at least) is that this problem only occurs with this activity, all other activity can access both 3g and wifi and they uses the same Class as MainActivity. how can it be?

MainActivity:

public class MainActivity extends Activity implements OnTaskCompleted{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_activity);

        try {
            version=Float.parseFloat(getApplicationContext().getPackageManager().
                    getPackageInfo(getApplicationContext().getPackageName(), 0).versionName);
        } catch (NumberFormatException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NameNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        if(!isOnline()){
            //prevent user to go further
        }else{      
            String url="/*mydomain*//version_check.php";
            PostRequest post=new PostRequest(url,null,MainActivity.this,"version");
            post.execute(url);
        }

        //LOGIN CODE
    }

    @Override
    public void onTaskCompleted(Object return_value, String type) {
        if(type.equals("version")){
            float latest=Float.parseFloat((String)return_value);
            if(version<latest){
                AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(MainActivity.this);                
                 alertDialogBuilder.setMessage("update app!!!");
                    alertDialogBuilder.setNegativeButton("not now",new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog,int id) {
                            // if this button is clicked, close
                            // current activity
                            finish();
                        }
                      });
                    alertDialogBuilder.setPositiveButton("update now!",new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog,int id) {
                                // if this button is clicked, close
                                // current activity
                                //go to playstore
                            }
                          });

                        // create alert dialog
                        alertDialog = alertDialogBuilder.create();
                        alertDialog.show();
            }
        }
        if(type.equals("login")){
            //login response handling


    }

    public boolean isOnline(){
        ConnectivityManager cm=(ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo netInfo=cm.getActiveNetworkInfo();
        if (netInfo != null && netInfo.isConnectedOrConnecting()){
            return true;
        }
        return false;
    }

}

PostRequest code: public class PostRequest extends AsyncTask {

private HttpClient client;
private HttpPost request;
public String result, type;
private OnTaskCompleted listener;
public HttpResponse response;

public PostRequest(String url, List<NameValuePair> nameValuePairs, OnTaskCompleted listener, String type){
    this.client=new DefaultHttpClient();
    this.request = new HttpPost(url);
    this.listener=listener;
    this.type=type;



    try {
        if(nameValuePairs!=null)
            request.setEntity(new UrlEncodedFormEntity(nameValuePairs));
    } catch (UnsupportedEncodingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    }


@Override
protected HttpResponse doInBackground(String... params) {

    try {

        response = client.execute(request);
        StatusLine statusLine = response.getStatusLine();
        if(statusLine.getStatusCode() == HttpStatus.SC_OK){

        }
    } catch (ClientProtocolException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return response;
}

@Override
protected void onPostExecute(HttpResponse result) {
            //if the response doesn't contain a json
    if(type.equals("mod_database")||type.equals("version")||type.equals("push")){
        ByteArrayOutputStream out=new ByteArrayOutputStream();
        out = new ByteArrayOutputStream();
        try {
            response.getEntity().writeTo(out);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        if(listener!=null)
            listener.onTaskCompleted(out.toString(),type);
        return;
    }
        //the response contain a json
    ReadJson jsonR=new ReadJson(type);
    Object obj=jsonR.read(response);
    listener.onTaskCompleted(obj, type);    
}

}

StackTrace:

02-20 17:15:57.305: E/AndroidRuntime(13460): FATAL EXCEPTION: main
02-20 17:15:57.305: E/AndroidRuntime(13460): android.os.NetworkOnMainThreadException
02-20 17:15:57.305: E/AndroidRuntime(13460):    at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1118)
02-20 17:15:57.305: E/AndroidRuntime(13460):    at libcore.io.BlockGuardOs.recvfrom(BlockGuardOs.java:163)
02-20 17:15:57.305: E/AndroidRuntime(13460):    at libcore.io.IoBridge.recvfrom(IoBridge.java:513)
02-20 17:15:57.305: E/AndroidRuntime(13460):    at java.net.PlainSocketImpl.read(PlainSocketImpl.java:488)
02-20 17:15:57.305: E/AndroidRuntime(13460):    at java.net.PlainSocketImpl.access$000(PlainSocketImpl.java:46)
02-20 17:15:57.305: E/AndroidRuntime(13460):    at java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:240)
02-20 17:15:57.305: E/AndroidRuntime(13460):    at org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:103)
02-20 17:15:57.305: E/AndroidRuntime(13460):    at org.apache.http.impl.io.AbstractSessionInputBuffer.readLine(AbstractSessionInputBuffer.java:191)
02-20 17:15:57.305: E/AndroidRuntime(13460):    at org.apache.http.impl.io.ChunkedInputStream.getChunkSize(ChunkedInputStream.java:220)
02-20 17:15:57.305: E/AndroidRuntime(13460):    at org.apache.http.impl.io.ChunkedInputStream.nextChunk(ChunkedInputStream.java:183)
02-20 17:15:57.305: E/AndroidRuntime(13460):    at org.apache.http.impl.io.ChunkedInputStream.read(ChunkedInputStream.java:155)
02-20 17:15:57.305: E/AndroidRuntime(13460):    at org.apache.http.impl.io.ChunkedInputStream.read(ChunkedInputStream.java:175)
02-20 17:15:57.305: E/AndroidRuntime(13460):    at org.apache.http.entity.BasicHttpEntity.writeTo(BasicHttpEntity.java:129)
02-20 17:15:57.305: E/AndroidRuntime(13460):    at org.apache.http.entity.HttpEntityWrapper.writeTo(HttpEntityWrapper.java:101)
02-20 17:15:57.305: E/AndroidRuntime(13460):    at org.apache.http.conn.BasicManagedEntity.writeTo(BasicManagedEntity.java:126)
02-20 17:15:57.305: E/AndroidRuntime(13460):    at it.stepapp.clienti.PostRequest.onPostExecute(PostRequest.java:78)
02-20 17:15:57.305: E/AndroidRuntime(13460):    at it.stepapp.clienti.PostRequest.onPostExecute(PostRequest.java:1)
02-20 17:15:57.305: E/AndroidRuntime(13460):    at android.os.AsyncTask.finish(AsyncTask.java:631)
02-20 17:15:57.305: E/AndroidRuntime(13460):    at android.os.AsyncTask.access$600(AsyncTask.java:177)
02-20 17:15:57.305: E/AndroidRuntime(13460):    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
02-20 17:15:57.305: E/AndroidRuntime(13460):    at android.os.Handler.dispatchMessage(Handler.java:99)
02-20 17:15:57.305: E/AndroidRuntime(13460):    at android.os.Looper.loop(Looper.java:137)
02-20 17:15:57.305: E/AndroidRuntime(13460):    at android.app.ActivityThread.main(ActivityThread.java:4856)
02-20 17:15:57.305: E/AndroidRuntime(13460):    at java.lang.reflect.Method.invokeNative(Native Method)
02-20 17:15:57.305: E/AndroidRuntime(13460):    at java.lang.reflect.Method.invoke(Method.java:511)
02-20 17:15:57.305: E/AndroidRuntime(13460):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1007)
02-20 17:15:57.305: E/AndroidRuntime(13460):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774)
02-20 17:15:57.305: E/AndroidRuntime(13460):    at dalvik.system.NativeStart.main(Native Method)

解决方案

FATAL EXCEPTION: main
android.os.NetworkOnMainThreadException

at it.stepapp.clienti.PostRequest.onPostExecute(PostRequest.java:78)
at it.stepapp.clienti.PostRequest.onPostExecute(PostRequest.java:1)

Do not do network operations in onPostExecute() as that runs in the main thread.

Whatever you are doing at line 78 of PostRequest.java (you can identify that, we can't) is ultimately a network operation. You need to do that in the doInBackground() method instead.

这篇关于Android应用程序的工作原理在3G上,但不是在无线网络的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆