在机器人的AsyncTask:如何删除致命的异常 [英] how to remove FATAL EXCEPTION: AsyncTask in android

查看:240
本文介绍了在机器人的AsyncTask:如何删除致命的异常的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

  10-23 00:41:00.705:E / AndroidRuntime(3622):致命异常:AsyncTask的#1
10-23 00:41:00.705:E / AndroidRuntime(3622):java.lang.RuntimeException的:一个错误而执行doInBackground发生()
10-23 00:41:00.705:E / AndroidRuntime(3622):在android.os.AsyncTask $ 3.done(AsyncTask.java:299)
10-23 00:41:00.705:E / AndroidRuntime(3622):在java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
10-23 00:41:00.705:E / AndroidRuntime(3622):在java.util.concurrent.FutureTask.setException(FutureTask.java:219)
10-23 00:41:00.705:E / AndroidRuntime(3622):在java.util.concurrent.FutureTask.run(FutureTask.java:239)
10-23 00:41:00.705:E / AndroidRuntime(3622):在android.os.AsyncTask $ SerialExecutor $ 1.运行(AsyncTask.java:230)
10-23 00:41:00.705:E / AndroidRuntime(3622):在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
10-23 00:41:00.705:E / AndroidRuntime(3622):在java.util.concurrent.ThreadPoolExecutor中的$ Worker.run(ThreadPoolExecutor.java:573)
10-23 00:41:00.705:E / AndroidRuntime(3622):在java.lang.Thread.run(Thread.java:856)
10-23 00:41:00.705:E / AndroidRuntime(3622):致:java.lang.IllegalStateException:内容都被消耗
10-23 00:41:00.705:E / AndroidRuntime(3622):在org.apache.http.entity.BasicHttpEntity.getContent(BasicHttpEntity.java:84)
10-23 00:41:00.705:E / AndroidRuntime(3622):在org.apache.http.entity.BasicHttpEntity.writeTo(BasicHttpEntity.java:126)
10-23 00:41:00.705:E / AndroidRuntime(3622):在org.apache.http.entity.HttpEntityWrapper.writeTo(HttpEntityWrapper.java:101)
10-23 00:41:00.705:E / AndroidRuntime(3622):在org.apache.http.conn.BasicManagedEntity.writeTo(BasicManagedEntity.java:126)
10-23 00:41:00.705:E / AndroidRuntime(3622):在com.firstgroup.webservice.RequestTask.doInBackground(RequestTask.java:51)
10-23 00:41:00.705:E / AndroidRuntime(3622):在com.firstgroup.webservice.RequestTask.doInBackground(RequestTask.java:1)
10-23 00:41:00.705:E / AndroidRuntime(3622):在android.os.AsyncTask $ 2.call(AsyncTask.java:287)
10-23 00:41:00.705:E / AndroidRuntime(3622):在java.util.concurrent.FutureTask.run(FutureTask.java:234)
10-23 00:41:00.705:E / AndroidRuntime(3622):4 ...更多
 

你好

我打电话给我的网络服务使用GSON库我收到exception.I不知道为什么它会发生.could请你告诉我删除这个错误 我会给你的步骤我做什么.. 1)主要活动

 公共类Appliacationload扩展活动实现WebserviceCallBack {

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

        / * WebserviceMethod callDepartudeDashboard =新WebserviceMethod();
        callDepartudeDashboard.setObserver(本);
        callDepartudeDashboard.getwebService(ConstantVariable.dashboardWebServiceURL+"a/"+"arrival"+"?crs$c$c=hnh");*/
        RequestTask callWebService =新RequestTask();
        callWebService.setObserver(本);
         callWebService.execute(ConstantVariable.dashboardWebServiceURL +A /+到达+CRS code = VIC?);



    }

    @覆盖
    公共无效getWebserviceResponse(字符串响应){
        // TODO自动生成方法存根
        Log.d(回应,回应);



    }

}
 

和我有一个支架和RequestTask类来调用Web服务并返回再打。

 公共类RequestTask扩展的AsyncTask<字符串,字符串,字符串> {
    私人WebserviceCallBack回调;
    私人ProgressDialog progressDialog;
    @覆盖
    在preExecute保护无效(){
        // TODO自动生成方法存根
        progressDialog =新ProgressDialog((上下文)回调);
        super.on preExecute();
        progressDialog.setTitle(请稍候...);
        progressDialog.setMessage(web服务呼叫......);
        progressDialog.setCancelable(真正的);
        progressDialog.show();
    }

    @覆盖
    保护字符串doInBackground(字符串... URI){
        HttpClient的HttpClient的=新DefaultHttpClient();
        HTT presponse响应;
        字符串responseString = NULL;
        尝试 {
            响应= httpclient.execute(新HTTPGET(URI [0]));
            状态行状态行= response.getStatusLine();
            如果(statusLine.getStatus code()== HttpStatus.SC_OK){
                读卡器读卡器=新的InputStreamReader(response.getEntity()的getContent());
                GSON GSON =新GSON();
                持有人response1 = gson.fromJson(读卡器,Holder.class);
                ByteArrayOutputStream OUT =新ByteArrayOutputStream();
                。response.getEntity()的writeTo(出);
                out.close();
                responseString = out.toString();
            } 其他{
                //关闭连接。
                。response.getEntity()的getContent()close()方法。
                抛出新IOException异常(statusLine.getReasonPhrase());
            }
        }赶上(ClientProtocolException E){
            // TODO处理问题.. \
            progressDialog.hide();
        }赶上(IOException异常E){
            // TODO处理问题..
            progressDialog.hide();
        }
        返回responseString;
    }

    @覆盖
    保护无效onPostExecute(字符串结果){
        super.onPostExecute(结果);
        //与响应做任何事..
        如果(回调!= NULL){
            callBack.getWebserviceResponse(结果);
        }
        progressDialog.hide();
    }
    公共无效setObserver(WebserviceCallBack回调){
        回调=回调;
    }


}
 

Holder类;

 公共类持有人{
    名单< deparaturedaseboarddto>数据;
}
 

新更新当我改变这样的我的要求的任务。

 公共类RequestTask扩展的AsyncTask<字符串,字符串,为InputStream> {
    私人WebserviceCallBack回调;
    私人ProgressDialog progressDialog;
    @覆盖
    在preExecute保护无效(){
        // TODO自动生成方法存根
        progressDialog =新ProgressDialog((上下文)回调);
        super.on preExecute();
        progressDialog.setTitle(请稍候...);
        progressDialog.setMessage(web服务呼叫......);
        progressDialog.setCancelable(真正的);
        progressDialog.show();
    }

    @覆盖
    受保护的InputStream doInBackground(字符串... URI){
        HttpClient的HttpClient的=新DefaultHttpClient();
        HTT presponse响应;
        字符串responseString = NULL;
        尝试 {
            响应= httpclient.execute(新HTTPGET(URI [0]));
            状态行状态行= response.getStatusLine();
            如果(statusLine.getStatus code()== HttpStatus.SC_OK){
                / *读卡器读卡器=新的InputStreamReader(response.getEntity()的getContent());
                GSON GSON =新GSON();
                持有人response1 = gson.fromJson(读卡器,Holder.class);
                ByteArrayOutputStream OUT =新ByteArrayOutputStream();
                。response.getEntity()的writeTo(出);
                out.close();
                responseString = out.toString(); * /
                返回response.getEntity()的getContent()。
            } 其他{
                //关闭连接。
                。response.getEntity()的getContent()close()方法。
                抛出新IOException异常(statusLine.getReasonPhrase());
            }
        }赶上(ClientProtocolException E){
            // TODO处理问题.. \
            progressDialog.hide();
        }赶上(IOException异常E){
            // TODO处理问题..
            progressDialog.hide();
        }
        返回null;
    }

    @覆盖
    保护无效onPostExecute(InputStream的结果){
        super.onPostExecute(结果);
        //与响应做任何事..

        如果(回调!= NULL){
            callBack.getWebserviceResponse(结果);
        }
        progressDialog.dismiss();
        progressDialog = NULL;

    }
    公共无效setObserver(WebserviceCallBack回调){
        回调=回调;
    }


}
 

回调一样,

 公共接口WebserviceCallBack {
    公共无效getWebserviceResponse(InputStream的结果);

}
 

主要活动一样,

 公共类Appliacationload扩展活动实现WebserviceCallBack {

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

        / * WebserviceMethod callDepartudeDashboard =新WebserviceMethod();
        callDepartudeDashboard.setObserver(本);
        callDepartudeDashboard.getwebService(ConstantVariable.dashboardWebServiceURL+"a/"+"arrival"+"?crs$c$c=hnh");*/
        RequestTask callWebService =新RequestTask();
          callWebService.setObserver(本);
         callWebService.execute(ConstantVariable.dashboardWebServiceURL +A /+到达+CRS code = VIC?);



    }

    @覆盖
    公共无效getWebserviceResponse(InputStream的结果){
        // TODO自动生成方法存根
        读卡器读卡器=新InputStreamReader的(结果);
      GSON GSON =新GSON();
    持有人response1 = gson.fromJson(读卡器,Holder.class);
    Log.d(-----,纳文);
    }
 

我得到这个例外,为什么..?我随叫随到发送输入流回来,在这里做的主要活动。

异常:

  3月10日至二十三日:07:33.956:E / AndroidRuntime(22412):致命异常:主要
3月10日至23号:07:33.956:E / AndroidRuntime(22412):android.os.NetworkOnMainThreadException
3月10日至23号:07:33.956:E / AndroidRuntime(22412):在android.os.StrictMode $ AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117)
3月10日至23号:07:33.956:E / AndroidRuntime(22412):在libcore.io.BlockGuardOs.recvfrom(BlockGuardOs.java:163)
3月10日至23号:07:33.956:E / AndroidRuntime(22412):在libcore.io.IoBridge.recvfrom(IoBridge.java:513)
3月10日至23号:07:33.956:E / AndroidRuntime(22412):在java.net.PlainSocketImpl.read(PlainSocketImpl.java:488)
3月10日至23号:07:33.956:E / AndroidRuntime(22412):在java.net.PlainSocketImpl.access $ 000(PlainSocketImpl.java:46)
3月10日至23号:07:33.956:E / AndroidRuntime(22412):在java.net.PlainSocketImpl $ PlainSocketInputStream.read(PlainSocketImpl.java:240)
3月10日至23号:07:33.956:E / AndroidRuntime(22412):在org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:103)
3月10日至23号:07:33.956:E / AndroidRuntime(22412):在org.apache.http.impl.io.AbstractSessionInputBuffer.read(AbstractSessionInputBuffer.java:134)
3月10日至23号:07:33.956:E / AndroidRuntime(22412):在org.apache.http.impl.io.ChunkedInputStream.read(ChunkedInputStream.java:161)
3月10日至23号:07:33.956:E / AndroidRuntime(22412):在org.apache.http.conn.EofSensorInputStream.read(EofSensorInputStream.java:159)
3月10日至23号:07:33.956:E / AndroidRuntime(22412):在java.io.InputStreamReader.read(InputStreamReader.java:244)
3月10日至23号:07:33.956:E / AndroidRuntime(22412):在com.google.gson.stream.JsonReader.fillBuffer(JsonReader.java:1298)
3月10日至23号:07:33.956:E / AndroidRuntime(22412):在com.google.gson.stream.JsonReader.nextQuotedValue(JsonReader.java:1028)
3月10日至23号:07:33.956:E / AndroidRuntime(22412):在com.google.gson.stream.JsonReader.nextName(JsonReader.java:796)
3月10日至23号:07:33.956:E / AndroidRuntime(22412):在com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:178)
3月10日至23号:07:33.956:E / AndroidRuntime(22412):在com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:40)
3月10日至23号:07:33.956:E / AndroidRuntime(22412):在com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:81)
3月10日至23号:07:33.956:E / AndroidRuntime(22412):在com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:60)
3月10日至23号:07:33.956:E / AndroidRuntime(22412):在com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:95)
3月10日至23号:07:33.956:E / AndroidRuntime(22412):在com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:183)
3月10日至23号:07:33.956:E / AndroidRuntime(22412):在com.google.gson.Gson.fromJson(Gson.java:805)
3月10日至23号:07:33.956:E / AndroidRuntime(22412):在com.google.gson.Gson.fromJson(Gson.java:743)
3月10日至23号:07:33.956:E / AndroidRuntime(22412):在com.firstgroup.applicationload.Appliacationload.getWebserviceResponse(Appliacationload.java:48)
3月10日至23号:07:33.956:E / AndroidRuntime(22412):在com.firstgroup.webservice.RequestTask.onPostExecute(RequestTask.java:77)
3月10日至23号:07:33.956:E / AndroidRuntime(22412):在com.firstgroup.webservice.RequestTask.onPostExecute(RequestTask.java:1)
3月10日至23号:07:33.956:E / AndroidRuntime(22412):在android.os.AsyncTask.finish(AsyncTask.java:631)
3月10日至23号:07:33.956:E / AndroidRuntime(22412):在android.os.AsyncTask.access $ 600(AsyncTask.java:177)
3月10日至23号:07:33.956:E / AndroidRuntime(22412):在android.os.AsyncTask $ InternalHandler.handleMessage(AsyncTask.java:644)
3月10日至23号:07:33.956:E / AndroidRuntime(22412):在android.os.Handler.dispatchMessage(Handler.java:99)
3月10日至23号:07:33.956:E / AndroidRuntime(22412):在android.os.Looper.loop(Looper.java:137)
3月10日至23号:07:33.956:E / AndroidRuntime(22412):在android.app.ActivityThread.main(ActivityThread.java:5041)
3月10日至23号:07:33.956:E / AndroidRuntime(22412):在java.lang.reflect.Method.invokeNative(本机方法)
3月10日至23号:07:33.956:E / AndroidRuntime(22412):在java.lang.reflect.Method.invoke(Method.java:511)
3月10日至23号:07:33.956:E / AndroidRuntime(22412):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:793)
3月10日至23号:07:33.956:E / AndroidRuntime(22412):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
3月10日至23号:07:33.956:E / AndroidRuntime(22412):在dalvik.system.NativeStart.main(本机方法)
 

解决方案

原因是,你只能消耗内容实体键。

您做了两次(也许你不知道它),在这里

 读卡器读卡器=新的InputStreamReader(response.getEntity()的getContent());
 

在这里

  response.getEntity()的writeTo(出)。
 

我知道这听起​​来有点不可思议,但实际上的writeTo()函数会从实体内容写入的OutputStream 。你可以看到它的文档<一中href="http://developer.android.com/reference/org/apache/http/HttpEntity.html#writeTo(java.io.OutputStream)"相对=nofollow>这里

另一个解决办法可以使用​​的将其串并让GSON处理它

  @覆盖
保护字符串doInBackground(字符串... URI){
    HttpClient的HttpClient的=新DefaultHttpClient();
    HTT presponse响应;
    字符串responseString = NULL;
    尝试 {
        响应= httpclient.execute(新HTTPGET(URI [0]));
        状态行状态行= response.getStatusLine();
        如果(statusLine.getStatus code()== HttpStatus.SC_OK){
            responseString = EntityUtils.toString(response.getEntity()); //内容将消耗一次
            GSON GSON =新GSON();
            持有人response1 = gson.fromJson(responseString,Holder.class);
        } 其他{
            //关闭连接。
            。response.getEntity()的getContent()close()方法。
            抛出新IOException异常(statusLine.getReasonPhrase());
        }
    }赶上(ClientProtocolException E){
        // TODO处理问题.. \
        progressDialog.hide();
    }赶上(IOException异常E){
        // TODO处理问题..
        progressDialog.hide();
    }
    返回responseString;
}
 

我希望我的回答能帮助你!

10-23 00:41:00.705: E/AndroidRuntime(3622): FATAL EXCEPTION: AsyncTask #1
10-23 00:41:00.705: E/AndroidRuntime(3622): java.lang.RuntimeException: An error occured while executing doInBackground()
10-23 00:41:00.705: E/AndroidRuntime(3622):     at android.os.AsyncTask$3.done(AsyncTask.java:299)
10-23 00:41:00.705: E/AndroidRuntime(3622):     at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
10-23 00:41:00.705: E/AndroidRuntime(3622):     at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
10-23 00:41:00.705: E/AndroidRuntime(3622):     at java.util.concurrent.FutureTask.run(FutureTask.java:239)
10-23 00:41:00.705: E/AndroidRuntime(3622):     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
10-23 00:41:00.705: E/AndroidRuntime(3622):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
10-23 00:41:00.705: E/AndroidRuntime(3622):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
10-23 00:41:00.705: E/AndroidRuntime(3622):     at java.lang.Thread.run(Thread.java:856)
10-23 00:41:00.705: E/AndroidRuntime(3622): Caused by: java.lang.IllegalStateException: Content has been consumed
10-23 00:41:00.705: E/AndroidRuntime(3622):     at org.apache.http.entity.BasicHttpEntity.getContent(BasicHttpEntity.java:84)
10-23 00:41:00.705: E/AndroidRuntime(3622):     at org.apache.http.entity.BasicHttpEntity.writeTo(BasicHttpEntity.java:126)
10-23 00:41:00.705: E/AndroidRuntime(3622):     at org.apache.http.entity.HttpEntityWrapper.writeTo(HttpEntityWrapper.java:101)
10-23 00:41:00.705: E/AndroidRuntime(3622):     at org.apache.http.conn.BasicManagedEntity.writeTo(BasicManagedEntity.java:126)
10-23 00:41:00.705: E/AndroidRuntime(3622):     at com.firstgroup.webservice.RequestTask.doInBackground(RequestTask.java:51)
10-23 00:41:00.705: E/AndroidRuntime(3622):     at com.firstgroup.webservice.RequestTask.doInBackground(RequestTask.java:1)
10-23 00:41:00.705: E/AndroidRuntime(3622):     at android.os.AsyncTask$2.call(AsyncTask.java:287)
10-23 00:41:00.705: E/AndroidRuntime(3622):     at java.util.concurrent.FutureTask.run(FutureTask.java:234)
10-23 00:41:00.705: E/AndroidRuntime(3622):     ... 4 more

Hi

I am calling my web service using gson library I am getting exception.I don't know why it is occur .could you please tell me removing this error I will give you steps what I did .. 1 )Main activity

public class Appliacationload extends Activity implements WebserviceCallBack{

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

        /*WebserviceMethod callDepartudeDashboard=new WebserviceMethod();
        callDepartudeDashboard.setObserver(this);
        callDepartudeDashboard.getwebService(ConstantVariable.dashboardWebServiceURL+"a/"+"arrival"+"?crsCode=hnh");*/
        RequestTask callWebService=new RequestTask();
        callWebService.setObserver(this);
         callWebService.execute(ConstantVariable.dashboardWebServiceURL+"a/"+"arrival"+"?crsCode=vic");



    }

    @Override
    public void getWebserviceResponse(String response) {
        // TODO Auto-generated method stub
        Log.d("response", response);



    }

}

and I have one holder and RequestTask class to call webservice and return call back .

public class RequestTask extends AsyncTask<String, String, String>{
    private  WebserviceCallBack callBack;
    private ProgressDialog progressDialog;
    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        progressDialog= new ProgressDialog((Context) callBack);
        super.onPreExecute();
        progressDialog.setTitle("Please Wait...");
        progressDialog.setMessage("Webservice Call...");
        progressDialog.setCancelable(true);
        progressDialog.show();
    }

    @Override
    protected String doInBackground(String... uri) {
        HttpClient httpclient = new DefaultHttpClient();
        HttpResponse response;
        String responseString = null;
        try {
            response = httpclient.execute(new HttpGet(uri[0]));
            StatusLine statusLine = response.getStatusLine();
            if(statusLine.getStatusCode() == HttpStatus.SC_OK){
                Reader reader = new InputStreamReader(response.getEntity().getContent());
                Gson gson = new Gson();
                Holder response1 = gson.fromJson(reader, Holder.class);
                ByteArrayOutputStream out = new ByteArrayOutputStream();
                response.getEntity().writeTo(out);
                out.close();
                responseString = out.toString();
            } else{
                //Closes the connection.
                response.getEntity().getContent().close();
                throw new IOException(statusLine.getReasonPhrase());
            }
        } catch (ClientProtocolException e) {
            //TODO Handle problems..\
            progressDialog.hide();
        } catch (IOException e) {
            //TODO Handle problems..
            progressDialog.hide();
        }
        return responseString;
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        //Do anything with response..
        if(callBack!=null){
            callBack.getWebserviceResponse(result);
        }
        progressDialog.hide();
    }
    public void setObserver(WebserviceCallBack callback){
        callBack=callback;
    }


}

Holder class;

public class Holder {
    List<deparaturedaseboarddto> data;
}

New Update when I change my request task like that ..

public class RequestTask extends AsyncTask<String, String, InputStream>{
    private  WebserviceCallBack callBack;
    private ProgressDialog progressDialog;
    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        progressDialog= new ProgressDialog((Context) callBack);
        super.onPreExecute();
        progressDialog.setTitle("Please Wait...");
        progressDialog.setMessage("Webservice Call...");
        progressDialog.setCancelable(true);
        progressDialog.show();
    }

    @Override
    protected InputStream doInBackground(String... uri) {
        HttpClient httpclient = new DefaultHttpClient();
        HttpResponse response;
        String responseString = null;
        try {
            response = httpclient.execute(new HttpGet(uri[0]));
            StatusLine statusLine = response.getStatusLine();
            if(statusLine.getStatusCode() == HttpStatus.SC_OK){
                /*Reader reader = new InputStreamReader(response.getEntity().getContent());
                Gson gson = new Gson();
                Holder response1 = gson.fromJson(reader, Holder.class);
                ByteArrayOutputStream out = new ByteArrayOutputStream();
                response.getEntity().writeTo(out);
                out.close();
                responseString = out.toString();*/
                return response.getEntity().getContent();
            } else{
                //Closes the connection.
                response.getEntity().getContent().close();
                throw new IOException(statusLine.getReasonPhrase());
            }
        } catch (ClientProtocolException e) {
            //TODO Handle problems..\
            progressDialog.hide();
        } catch (IOException e) {
            //TODO Handle problems..
            progressDialog.hide();
        }
        return null;
    }

    @Override
    protected void onPostExecute(InputStream result) {
        super.onPostExecute(result);
        //Do anything with response..

        if(callBack!=null){
            callBack.getWebserviceResponse(result);
        }
        progressDialog.dismiss();
        progressDialog=null;

    }
    public void setObserver(WebserviceCallBack callback){
        callBack=callback;
    }


}

and call back like that

public interface WebserviceCallBack {
    public void getWebserviceResponse(InputStream result);

}

and main activity like that

public class Appliacationload extends Activity implements WebserviceCallBack{

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

        /*WebserviceMethod callDepartudeDashboard=new WebserviceMethod();
        callDepartudeDashboard.setObserver(this);
        callDepartudeDashboard.getwebService(ConstantVariable.dashboardWebServiceURL+"a/"+"arrival"+"?crsCode=hnh");*/
        RequestTask callWebService=new RequestTask();
          callWebService.setObserver(this);
         callWebService.execute(ConstantVariable.dashboardWebServiceURL+"a/"+"arrival"+"?crsCode=vic");



    }

    @Override
    public void getWebserviceResponse(InputStream result) {
        // TODO Auto-generated method stub
        Reader reader = new InputStreamReader(result);
      Gson gson = new Gson();
    Holder response1 = gson.fromJson(reader, Holder.class);
    Log.d("-----", "naveen");
    }

I got this exception why ..?I am sending the input stream on call back and make here in main activity ..

exception:

10-23 03:07:33.956: E/AndroidRuntime(22412): FATAL EXCEPTION: main
10-23 03:07:33.956: E/AndroidRuntime(22412): android.os.NetworkOnMainThreadException
10-23 03:07:33.956: E/AndroidRuntime(22412):    at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117)
10-23 03:07:33.956: E/AndroidRuntime(22412):    at libcore.io.BlockGuardOs.recvfrom(BlockGuardOs.java:163)
10-23 03:07:33.956: E/AndroidRuntime(22412):    at libcore.io.IoBridge.recvfrom(IoBridge.java:513)
10-23 03:07:33.956: E/AndroidRuntime(22412):    at java.net.PlainSocketImpl.read(PlainSocketImpl.java:488)
10-23 03:07:33.956: E/AndroidRuntime(22412):    at java.net.PlainSocketImpl.access$000(PlainSocketImpl.java:46)
10-23 03:07:33.956: E/AndroidRuntime(22412):    at java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:240)
10-23 03:07:33.956: E/AndroidRuntime(22412):    at org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:103)
10-23 03:07:33.956: E/AndroidRuntime(22412):    at org.apache.http.impl.io.AbstractSessionInputBuffer.read(AbstractSessionInputBuffer.java:134)
10-23 03:07:33.956: E/AndroidRuntime(22412):    at org.apache.http.impl.io.ChunkedInputStream.read(ChunkedInputStream.java:161)
10-23 03:07:33.956: E/AndroidRuntime(22412):    at org.apache.http.conn.EofSensorInputStream.read(EofSensorInputStream.java:159)
10-23 03:07:33.956: E/AndroidRuntime(22412):    at java.io.InputStreamReader.read(InputStreamReader.java:244)
10-23 03:07:33.956: E/AndroidRuntime(22412):    at com.google.gson.stream.JsonReader.fillBuffer(JsonReader.java:1298)
10-23 03:07:33.956: E/AndroidRuntime(22412):    at com.google.gson.stream.JsonReader.nextQuotedValue(JsonReader.java:1028)
10-23 03:07:33.956: E/AndroidRuntime(22412):    at com.google.gson.stream.JsonReader.nextName(JsonReader.java:796)
10-23 03:07:33.956: E/AndroidRuntime(22412):    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:178)
10-23 03:07:33.956: E/AndroidRuntime(22412):    at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:40)
10-23 03:07:33.956: E/AndroidRuntime(22412):    at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:81)
10-23 03:07:33.956: E/AndroidRuntime(22412):    at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:60)
10-23 03:07:33.956: E/AndroidRuntime(22412):    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:95)
10-23 03:07:33.956: E/AndroidRuntime(22412):    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:183)
10-23 03:07:33.956: E/AndroidRuntime(22412):    at com.google.gson.Gson.fromJson(Gson.java:805)
10-23 03:07:33.956: E/AndroidRuntime(22412):    at com.google.gson.Gson.fromJson(Gson.java:743)
10-23 03:07:33.956: E/AndroidRuntime(22412):    at com.firstgroup.applicationload.Appliacationload.getWebserviceResponse(Appliacationload.java:48)
10-23 03:07:33.956: E/AndroidRuntime(22412):    at com.firstgroup.webservice.RequestTask.onPostExecute(RequestTask.java:77)
10-23 03:07:33.956: E/AndroidRuntime(22412):    at com.firstgroup.webservice.RequestTask.onPostExecute(RequestTask.java:1)
10-23 03:07:33.956: E/AndroidRuntime(22412):    at android.os.AsyncTask.finish(AsyncTask.java:631)
10-23 03:07:33.956: E/AndroidRuntime(22412):    at android.os.AsyncTask.access$600(AsyncTask.java:177)
10-23 03:07:33.956: E/AndroidRuntime(22412):    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
10-23 03:07:33.956: E/AndroidRuntime(22412):    at android.os.Handler.dispatchMessage(Handler.java:99)
10-23 03:07:33.956: E/AndroidRuntime(22412):    at android.os.Looper.loop(Looper.java:137)
10-23 03:07:33.956: E/AndroidRuntime(22412):    at android.app.ActivityThread.main(ActivityThread.java:5041)
10-23 03:07:33.956: E/AndroidRuntime(22412):    at java.lang.reflect.Method.invokeNative(Native Method)
10-23 03:07:33.956: E/AndroidRuntime(22412):    at java.lang.reflect.Method.invoke(Method.java:511)
10-23 03:07:33.956: E/AndroidRuntime(22412):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
10-23 03:07:33.956: E/AndroidRuntime(22412):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
10-23 03:07:33.956: E/AndroidRuntime(22412):    at dalvik.system.NativeStart.main(Native Method)

解决方案

The reason is you can only consume Content from Entity once.

You did it twice (maybe without you knowing it) in here

Reader reader = new InputStreamReader(response.getEntity().getContent());

and here

response.getEntity().writeTo(out);

I know this is sounds a little weird but actually the writeTo() function will get content from the entity to write to the OutputStream. You can see it in the documentation here

Another workaround you can use is turning it to string and let GSON handle it

@Override
protected String doInBackground(String... uri) {
    HttpClient httpclient = new DefaultHttpClient();
    HttpResponse response;
    String responseString = null;
    try {
        response = httpclient.execute(new HttpGet(uri[0]));
        StatusLine statusLine = response.getStatusLine();
        if(statusLine.getStatusCode() == HttpStatus.SC_OK){
            responseString = EntityUtils.toString(response.getEntity()); // content will be consume only once
            Gson gson = new Gson();
            Holder response1 = gson.fromJson(responseString, Holder.class);
        } else{
            //Closes the connection.
            response.getEntity().getContent().close();
            throw new IOException(statusLine.getReasonPhrase());
        }
    } catch (ClientProtocolException e) {
        //TODO Handle problems..\
        progressDialog.hide();
    } catch (IOException e) {
        //TODO Handle problems..
        progressDialog.hide();
    }
    return responseString;
}

I hope my answer can help you!

这篇关于在机器人的AsyncTask:如何删除致命的异常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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