我有一个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
。请帮我找到问题。
感谢
答案 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);
}