سؤال

I have an asyntask

public class AsynNetworkOperation extends AsyncTask<String,Void,Void>{

private Context context = null;
private ProgressDialog dialog = null;
private String title = "";
private WebRequest request = null;
private String accessMethod = "";
private HttpResponse response = null;
AsynResponse delegate = null;

public AsynNetworkOperation(Context context, String method, String dialogTitle)
{
    this.context = context;
    accessMethod = method;
    this.title = dialogTitle;
    delegate = (AsynResponse) context;
}

@Override
protected void onPreExecute() {
    // TODO Auto-generated method stub
    super.onPreExecute();
    dialog = new ProgressDialog(context);
    dialog.setMessage(title);
    dialog.setCanceledOnTouchOutside(false);
    dialog.show();
}

@Override
protected Void doInBackground(String... data) {
    // TODO Auto-generated method stub
    request = new WebRequest(context);
    if(accessMethod.equals(ServiceUri.AccessMethod.GET)){
        response = request.makeHttpGetCall(data[0]);
    }
    return null;
}

@Override
protected void onPostExecute(Void result) {
    // TODO Auto-generated method stub
    super.onPostExecute(result);
    dialog.dismiss();
    delegate.responseResult(response);
    //dispose();
}

private void dispose()
{
    context = null;
    dialog = null;
    title = "";
    request = null;
    accessMethod = "";
    delegate = null;
}

}

and interface

public interface AsynResponse {

public void responseResult(HttpResponse response);

}

and then I have an SqliteHelper class

   //constructor 
public SQLLiteDbHelper(Context context,int dbVersion) {
    super(context,DATABASE_NAME, null, dbVersion);
    this.context = context;
    Log.d("tag","db version is "+DATABASE_VERSION);
    crypt = new Cryptography();
    utils = new Utils(context);
}
@Override
public void onCreate(final SQLiteDatabase db) {
    String s;

try {
    new AsynNetworkOperation(context, ServiceUri.AccessMethod.GET, "loading").execute(ServiceUri.SERVICE_URI+"s?d=abc"); 
} catch (Throwable t) {
    Toast.makeText(context, t.toString(), Toast.LENGTH_LONG).show();
    Log.d("tag",t.toString());
}
}

and a MainActivity class

public class MainActivity extends ListActivity implements AsynResponse{
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    searchText = (EditText) findViewById(R.id.searchText);
    utils = new Utils(MainActivity.this);
    db=(new SQLLiteDbHelper(MainActivity.this,utils.getInt(Key.Db_version))).getReadableDatabase(); 
    request = new WebRequest(this);
    status = new AsynGetEmployeeStatus();
}
   public void responseResult(HttpResponse response){
    HttpEntity et = response.getEntity();
String strr = utils.getResponseBody(et);  //it throw exception network on main thread
}
}

and get responsebody code is

    public String getResponseBody(final HttpEntity entity) throws Exception {

    InputStream instream = entity.getContent();

    if (instream == null) {
        return null;
    }

    if (entity.getContentLength() > Integer.MAX_VALUE) {
        return null;
    }

    StringBuilder buffer = new StringBuilder();
    BufferedReader reader = new BufferedReader(new InputStreamReader(instream, HTTP.UTF_8));

    String line = null;
    try {
        while ((line = reader.readLine()) != null) {
            buffer.append(line);
        }
    } 
    finally {
        instream.close();
        reader.close();
        line=null;
    }
    return buffer.toString();
}

it is working fine on emulator and but it is throwing network on main thread exception on device.I dont know why it is throwing exception.There are other network opeartion also which use the same asyntask but that work fine on device. only in this case it is throwing exception. Please help me finding the problem.

thanks

هل كانت مفيدة؟

المحلول

when it goes into getResponseBody method, it crashes at while ((line = reader.readLine()) != null) line

Apparently, you are calling getResponseBody() on the main application thread. Do that work in doInBackground() of your AsyncTask.

I am not getting why it is throwing exception while i am reading the content.because i have already the http response.

No, you do not. You started the HTTP request. You have not finished the HTTP request until you close the InputStream you get from the HttpEntity. That InputStream is reading off of the socket that represents the HTTP connection.

نصائح أخرى

add StrictMode:


if (android.os.Build.VERSION.SDK_INT > 9) {
                StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
                StrictMode.setThreadPolicy(policy);
                                                      }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top