NetworkOnMainThread异常android。获取服务器响应
当我尝试使用以下代码时,我收到了异常android.os.NetworkOnMainThreadException:NetworkOnMainThread异常android。获取服务器响应,android,asynchronous,Android,Asynchronous,当我尝试使用以下代码时,我收到了异常android.os.NetworkOnMainThreadException: public class CheckServer extends Activity{ @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInst
public class CheckServer extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
Runnable runn = null;
HttpTask.execute(runn);
}
private class HttpTask extends AsyncTask<String, String, String>
{
@Override
protected String doInBackground(String... params) {
// TODO Auto-generated method stub
HttpURLConnection urlConnection = null;
URL theURL = null;
try {
theURL = new URL("http://192.168.2.8/parkme/Client/clientquery.php?ticket=66t");
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
urlConnection = (HttpURLConnection) theURL.openConnection();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String response = null;
try {
response = readInputStream(urlConnection.getInputStream());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return response;
}
private String readInputStream(InputStream is) {
// TODO Auto-generated method stub
String line = "";
StringBuilder total = new StringBuilder();
BufferedReader rd = new BufferedReader(new InputStreamReader(is));
try {
while ((line = rd.readLine()) != null) {
total.append(line);
}
} catch (Exception e) {
e.printStackTrace();
}
return total.toString();
}
@Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(), result, Toast.LENGTH_LONG).show();
}
}}
公共类CheckServer扩展活动{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
//TODO自动生成的方法存根
super.onCreate(savedInstanceState);
Runnable runn=null;
HttpTask.execute(runn);
}
私有类HttpTask扩展了AsyncTask
{
@凌驾
受保护的字符串doInBackground(字符串…参数){
//TODO自动生成的方法存根
HttpURLConnection-urlConnection=null;
URL theURL=null;
试一试{
theURL=新URL(“http://192.168.2.8/parkme/Client/clientquery.php?ticket=66t");
}捕获(格式错误){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
试一试{
urlConnection=(HttpURLConnection)theURL.openConnection();
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
字符串响应=null;
试一试{
response=readInputStream(urlConnection.getInputStream());
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
返回响应;
}
私有字符串readInputStream(InputStream为){
//TODO自动生成的方法存根
字符串行=”;
StringBuilder总计=新StringBuilder();
BufferedReader rd=新的BufferedReader(新的InputStreamReader(is));
试一试{
而((line=rd.readLine())!=null){
合计.追加(行);
}
}捕获(例外e){
e、 printStackTrace();
}
返回total.toString();
}
@凌驾
受保护的void onPostExecute(字符串结果){
//TODO自动生成的方法存根
Toast.makeText(getApplicationContext(),result,Toast.LENGTH_LONG.show();
}
}}
如果可能,有人能告诉我如何在异步任务中使用它并获得输出吗?我试过了,但似乎没有成功。好的,让我们一步一步地做 1) 创建私有类扩展
AsyncTask
private class HttpUrlConnectionTask extends AsyncTask {
2) 重写doInBackground()
方法,这将执行重载
@Override
protected Object doInBackground(Object... params) {
// your HttpUrlConnection code goes here
return response;
3) 作业完成并返回后,将调用onPostExecute()
方法。result
参数包含doInBackground()
-so响应的返回值
@Override
protected void onPostExecute(Object result) {
在此方法中,您可以更新UI
4) 最后,让我们看看HttpUrlConnection
code
HttpURLConnection urlConnection = null;
URL theURL = new URL(url);
urlConnection = (HttpURLConnection) theURL.openConnection();
String response = readInputStream(urlConnection.getInputStream());
return response;
希望这有帮助。快乐编码 发生NetworkOnMainThread异常,因为您正在主UI线程上运行与网络相关的操作。这仅适用于目标为蜂巢SDK或更高版本的应用程序 您应该使用asynctask 在onCreate()中 您还可以将url等参数传递给AsyncTask的构造函数,并在doInBackground()中使用相同的参数
class任务扩展异步任务
{
受保护的void onPreExecute()
{super.onPreExecute();
//显示进度对话框。
}
受保护的void doInBackground(void…params)//在此处返回结果
{
//http请求。不要在此处更新ui
返回null;
}
protected void onPostExecute(void result)//doInBackground的结果被传递了一个参数
{
super.onPostExecute(结果);
//关闭进程对话框。
//使用返回的结果表单doInbackground()更新ui
}
}
执行异步任务时,任务将经历4个步骤:
@Raghunandan对AsyncTask的工作原理给出了非常好的解释 给你:
public static class InitializeTask extends MyAsyncTask<String, String, String> {
private Activity activity;
private ProgressDialog dialog;
public InitializeTask(Activity activity) {
this.activity = activity;
}
@Override
protected void onPostExecute(String result) {
Toast.makeText(activity, result, Toast.LENGTH_SHORT).show();
}
@Override
protected String doInBackground(String... params) {
HttpClient httpclient = new DefaultHttpClient();
HttpGet httpget = new HttpGet("http://192.168.2.8/localhost/parkme/Client/clientquery.php?ticket=");
try {
HttpResponse response = httpclient.execute(httpget);
if(response != null) {
String line = "";
InputStream inputstream = response.getEntity().getContent();
return convertStreamToString(inputstream);
} else {
return "Unable to complete your request";
}
} catch (ClientProtocolException e) {
return "Caught ClientProtocolException";
} catch (IOException e) {
return "Caught IOException";
}
}
private String convertStreamToString(InputStream is) {
String line = "";
StringBuilder total = new StringBuilder();
BufferedReader rd = new BufferedReader(new InputStreamReader(is));
try {
while ((line = rd.readLine()) != null) {
total.append(line);
}
} catch (Exception e) {
return "Stream Exception";
}
return total.toString();
}
}
正如它所说的,在活动运行的线程上不允许网络活动。将代码移动到异步任务是正确完成任务的方法。不过,如果你只是想让你的概念继续运作,你可以这样做
//lazy workaround with newer than gingerbread
//normally UI thread can't get Internet.
if(Build.VERSION.SDK_INT >= 9){
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}
然后UI线程实际上可以。我不会发布这样的东西,但是,我甚至还没有尝试过。这只是我的惰性调试动作,我经常使用。将代码张贴在您尝试使用的
AsyncTask
的地方。代码已更新,请选中“仅代码”回答。。。下投票(也许你考虑过)
public static class InitializeTask extends MyAsyncTask<String, String, String> {
private Activity activity;
private ProgressDialog dialog;
public InitializeTask(Activity activity) {
this.activity = activity;
}
@Override
protected void onPostExecute(String result) {
Toast.makeText(activity, result, Toast.LENGTH_SHORT).show();
}
@Override
protected String doInBackground(String... params) {
HttpClient httpclient = new DefaultHttpClient();
HttpGet httpget = new HttpGet("http://192.168.2.8/localhost/parkme/Client/clientquery.php?ticket=");
try {
HttpResponse response = httpclient.execute(httpget);
if(response != null) {
String line = "";
InputStream inputstream = response.getEntity().getContent();
return convertStreamToString(inputstream);
} else {
return "Unable to complete your request";
}
} catch (ClientProtocolException e) {
return "Caught ClientProtocolException";
} catch (IOException e) {
return "Caught IOException";
}
}
private String convertStreamToString(InputStream is) {
String line = "";
StringBuilder total = new StringBuilder();
BufferedReader rd = new BufferedReader(new InputStreamReader(is));
try {
while ((line = rd.readLine()) != null) {
total.append(line);
}
} catch (Exception e) {
return "Stream Exception";
}
return total.toString();
}
}
InitializeTask task = new InitializeTask(this)
task.execute()
//lazy workaround with newer than gingerbread
//normally UI thread can't get Internet.
if(Build.VERSION.SDK_INT >= 9){
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}