Android抛出NetworkOnMainThreadException

时间:2014-04-08 11:50:20

标签: android android-asynctask networkonmainthread

我有一个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;
}

}

和界面

public interface AsynResponse {

public void responseResult(HttpResponse response);

}

然后我有一个SqliteHelper

   //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());
}
}

MainActivity

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
}
}

并获取响应体代码

    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();
}

它在emulator上工作正常,但它在network on main thread exception上抛出device。我不知道它为什么会抛出异常。还有其他network opeartion也在使用相同的asyntask,但在设备上工作正常。仅在这种情况下它是throwing exception。请帮我找到问题。

感谢

2 个答案:

答案 0 :(得分:4)

  

当它进入getResponseBody方法时,它崩溃时while((line = reader.readLine())!= null)line

显然,您在主应用程序线程上调用getResponseBody()。这可以在doInBackground()的{​​{1}}中完成。

  

我不知道为什么在阅读内容时它会抛出异常。因为我已经有了http响应。

不,你没有。您启动了HTTP请求。在您关闭AsyncTask InputStream之前,您尚未完成HTTP请求。 HttpEntity正在读取代表HTTP连接的套接字。

答案 1 :(得分:-2)

add StrictMode:


if (android.os.Build.VERSION.SDK_INT > 9) {
                StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
                StrictMode.setThreadPolicy(policy);
                                                      }