NetworkOnMainThread异常android。获取服务器响应

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

当我尝试使用以下代码时,我收到了异常android.os.NetworkOnMainThreadException:

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个步骤:

  • onPreExecute(),在执行任务之前在UI线程上调用。此步骤通常用于设置任务,例如在用户界面中显示进度条

  • doInBackground(Params…),在onPreExecute()完成执行后立即在后台线程上调用此步骤用于执行可能需要很长时间的背景计算。异步任务的参数被传递到此步骤。此步骤必须返回计算结果,并将返回到最后一步。此步骤还可以使用publishProgress(Progress…)发布一个或多个进度单位。这些值在UI线程的onProgressUpdate(Progress…)步骤中发布

  • onProgressUpdate(Progress…),在调用publishProgress(Progress…)后在UI线程上调用。执行的时间未定义。此方法用于在后台计算仍在执行时在用户界面中显示任何形式的进度。例如,它可以用于制作进度条动画或在文本字段中显示日志

  • onPostExecute(Result),在后台计算完成后在UI线程上调用。后台计算的结果作为参数传递到此步骤。


  • @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);
    }