Domanda

I'm trying to get informations from my server, so I send a request to get a response:

private InputStream getInputStreamFromUrl(String url) {
    InputStream content = null;
    try {
        HttpClient httpclient = new DefaultHttpClient();
        HttpResponse response = httpclient.execute(new HttpGet(url));
        content = response.getEntity().getContent();
    } catch (Exception e) {
        Log.v(TAG, "Network exception", e);
    }
    return content;
}

I create an async task to prepare my request

public class HttpRequestTask extends AsyncTask<Request, Integer, Request[]>
{
HttpRequestTaskListner httpRequestTaskListner;

public void setHttpRequestTaskListner(HttpRequestTaskListner httpRequestTaskListner){
    this.httpRequestTaskListner = httpRequestTaskListner;
}

protected Request[] doInBackground(Request...requests){
    for(int i = 0; i<requests.length; i++){
        requests[i].execute();
    }
    return requests;
}

protected void onPostExecute(Request[] requests){
    if(requests != null){
        httpRequestTaskListner.httpRequestTaskSuccess(requests);
    }
    else{
        httpRequestTaskListner.HttpRequestTaskFailed();
    }
}

public static interface HttpRequestTaskListner{
    void httpRequestTaskSuccess(Request[] requests);
    void HttpRequestTaskFailed();
}
}

and I execute my request

public void register(final ResultListner resultListner)
{

    //define url
    String url = webServiceUrl;
    url += prop.getProperty("register");
    //TODO change mobile id
    url += "?mobile_id=test";
    url += "&app_id="+prop.getProperty("applicationId");

    //send request
    Request request = new Request(url);
    HttpRequestTask httpRequestTask = new HttpRequestTask();
    httpRequestTask.setHttpRequestTaskListner(new HttpRequestTaskListner() {



        @Override
        public void httpRequestTaskSuccess(Request[] requests) {
            resultListner.onResultSuccess(requests);
        }

        @Override
        public void HttpRequestTaskFailed() {
            resultListner.onResultFail();
        }
    });
    httpRequestTask.execute(request);
}

To finish I use the code in my activity

Server server = new Server(getApplicationContext());
    server.register(new ResultListner() {

        @Override
        public void onResultSuccess(Request[] request) {
            InputStream is = request[0].getResult();
            String result = Util.getStringFromInputStream(is);
            if(result.equals(Server.REGISTER_SUCCESS)){
                System.out.println("aa");
            }
            else{
                //TODO register error
            }
        }

        @Override
        public void onResultFail() {
            // TODO fail request
        }
    });

And sometimes I got a OnMainTheradException But I don't know why sometimes it works and sometimes I got the exception this is very strange

Log:

08-24 17:00:35.630: E/AndroidRuntime(7265): FATAL EXCEPTION: main
08-24 17:00:35.630: E/AndroidRuntime(7265): android.os.NetworkOnMainThreadException
08-24 17:00:35.630: E/AndroidRuntime(7265):     at     android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1118)
08-24 17:00:35.630: E/AndroidRuntime(7265):     at     libcore.io.BlockGuardOs.recvfrom(BlockGuardOs.java:163)
08-24 17:00:35.630: E/AndroidRuntime(7265):     at     libcore.io.IoBridge.recvfrom(IoBridge.java:513)
08-24 17:00:35.630: E/AndroidRuntime(7265):     at java.net.PlainSocketImpl.read(PlainSocketImpl.java:488)
08-24 17:00:35.630: E/AndroidRuntime(7265):     at java.net.PlainSocketImpl.access$000(PlainSocketImpl.java:46)
08-24 17:00:35.630: E/AndroidRuntime(7265):     at java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:240)
08-24 17:00:35.630: E/AndroidRuntime(7265):     at org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:103)
08-24 17:00:35.630: E/AndroidRuntime(7265):     at org.apache.http.impl.io.AbstractSessionInputBuffer.readLine(AbstractSessionInputBuffer.java:191)
08-24 17:00:35.630: E/AndroidRuntime(7265):     at org.apache.http.impl.io.ChunkedInputStream.getChunkSize(ChunkedInputStream.java:220)
08-24 17:00:35.630: E/AndroidRuntime(7265):     at org.apache.http.impl.io.ChunkedInputStream.nextChunk(ChunkedInputStream.java:183)
08-24 17:00:35.630: E/AndroidRuntime(7265):     at org.apache.http.impl.io.ChunkedInputStream.read(ChunkedInputStream.java:155)
08-24 17:00:35.630: E/AndroidRuntime(7265):     at org.apache.http.conn.EofSensorInputStream.read(EofSensorInputStream.java:159)
08-24 17:00:35.630: E/AndroidRuntime(7265):     at java.io.InputStreamReader.read(InputStreamReader.java:244)
08-24 17:00:35.630: E/AndroidRuntime(7265):     at java.io.Reader.read(Reader.java:145)
08-24 17:00:35.630: E/AndroidRuntime(7265):     at java.io.Reader.read(Reader.java:258)
08-24 17:00:35.630: E/AndroidRuntime(7265):     at java.util.Scanner.readMore(Scanner.java:2137)
08-24 17:00:35.630: E/AndroidRuntime(7265):     at java.util.Scanner.findPostDelimiter(Scanner.java:2107)
08-24 17:00:35.630: E/AndroidRuntime(7265):     at java.util.Scanner.setTokenRegion(Scanner.java:2017)
08-24 17:00:35.630: E/AndroidRuntime(7265):     at java.util.Scanner.next(Scanner.java:1004)
08-24 17:00:35.630: E/AndroidRuntime(7265):     at java.util.Scanner.next(Scanner.java:980)
08-24 17:00:35.630: E/AndroidRuntime(7265):     at com.easyapp.util.Util.getStringFromInputStream(Util.java:27)
08-24 17:00:35.630: E/AndroidRuntime(7265):     at com.easyapp.application.MainActivity$1.onResultSuccess(MainActivity.java:31)
08-24 17:00:35.630: E/AndroidRuntime(7265):     at com.easyapp.server.Server$1.httpRequestTaskSuccess(Server.java:49)
08-24 17:00:35.630: E/AndroidRuntime(7265):     at com.easyapp.server.HttpRequestTask.onPostExecute(HttpRequestTask.java:22)
08-24 17:00:35.630: E/AndroidRuntime(7265):     at com.easyapp.server.HttpRequestTask.onPostExecute(HttpRequestTask.java:1)
08-24 17:00:35.630: E/AndroidRuntime(7265):     at android.os.AsyncTask.finish(AsyncTask.java:631)
08-24 17:00:35.630: E/AndroidRuntime(7265):     at android.os.AsyncTask.access$600(AsyncTask.java:177)
08-24 17:00:35.630: E/AndroidRuntime(7265):     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
08-24 17:00:35.630: E/AndroidRuntime(7265):     at android.os.Handler.dispatchMessage(Handler.java:99)
08-24 17:00:35.630: E/AndroidRuntime(7265):     at android.os.Looper.loop(Looper.java:137)
08-24 17:00:35.630: E/AndroidRuntime(7265):     at android.app.ActivityThread.main(ActivityThread.java:4895)
08-24 17:00:35.630: E/AndroidRuntime(7265):     at java.lang.reflect.Method.invokeNative(Native Method)
08-24 17:00:35.630: E/AndroidRuntime(7265):     at java.lang.reflect.Method.invoke(Method.java:511)
08-24 17:00:35.630: E/AndroidRuntime(7265):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:994)
08-24 17:00:35.630: E/AndroidRuntime(7265):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:761)
08-24 17:00:35.630: E/AndroidRuntime(7265):     at dalvik.system.NativeStart.main(Native Method)

The error Util.java on line 27 is

public static String getStringFromInputStream(InputStream is)
{
    if(is == null){
        return null;
    }

    return new Scanner(is,"UTF-8").useDelimiter("\\A").next();
}

on

return new Scanner(is,"UTF-8").useDelimiter("\\A").next();
È stato utile?

Soluzione

I think android.os.NetworkOnMainThreadException Solution is....

Add:

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();

StrictMode.setThreadPolicy(policy); 

in your class,

and

ADD this to ManiFestFile:

<uses-permission android:name="android.permission.INTERNET"/>

Altri suggerimenti

  1. Do not use strictMode (only on debug mode)
  2. Do not change SDK version

Use Service or AsyncTask

A good tutorial to help you get started.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top