[英]Android:NetworkOnMainThreadException error inside AsyncTask
okay so i created a inner class which extends AsycTask in order for my code to run outwith the UI thread. 好的,所以我创建了一个内部类,该类扩展了AsycTask,以便我的代码与UI线程一起运行。 However i'm getting this error so i assume this means some part of my onPostExecute needs to be done in doInBackground however i cant figure out exactly what this is
但是我收到此错误,所以我认为这意味着我的onPostExecute的某些部分需要在doInBackground中完成,但是我无法弄清楚这到底是什么
public class asyncTask extends AsyncTask<String, Integer, String> {
ProgressDialog dialog = new ProgressDialog(PetrolPriceActivity.this);
@Override
protected void onPreExecute() {
dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
dialog.setProgress(0);
dialog.setMax(100);
dialog.setMessage("loading...");
dialog.show();
}
@Override
protected String doInBackground(String...parmans){
{
for(int i = 0; i < 100; i++){
publishProgress(1);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
String urlString = petrolPriceURL;
String result = "";
InputStream anInStream = null;
int response = -1;
URL url = null;
try {
url = new URL(urlString);
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
return null;
}
URLConnection conn = null;
try {
conn = url.openConnection();
} catch (IOException e) {
// TODO Auto-generated catch block
return null;
}
// Check that the connection can be opened
if (!(conn instanceof HttpURLConnection))
try {
throw new IOException("Not an HTTP connection");
} catch (IOException e) {
// TODO Auto-generated catch block
return null;
}
try
{
// Open connection
HttpURLConnection httpConn = (HttpURLConnection) conn;
httpConn.setAllowUserInteraction(false);
httpConn.setInstanceFollowRedirects(true);
httpConn.setRequestMethod("GET");
httpConn.connect();
response = httpConn.getResponseCode();
// Check that connection is OK
if (response == HttpURLConnection.HTTP_OK)
{
// Connection is OK so open a reader
anInStream = httpConn.getInputStream();
InputStreamReader in= new InputStreamReader(anInStream);
BufferedReader bin= new BufferedReader(in);
// Read in the data from the RSS stream
String line = new String();
while (( (line = bin.readLine())) != null)
{
result = result + "\n" + line;
}
}
}
catch (IOException ex)
{
try {
throw new IOException("Error connecting");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return result;
}
}
@Override
protected void onProgressUpdate(Integer...progress){
dialog.incrementProgressBy(progress[0]);
}
@Override
protected void onPostExecute(String result) {
// Get the data from the RSS stream as a string
errorText = (TextView)findViewById(R.id.error);
response = (TextView)findViewById(R.id.title);
try
{
// Get the data from the RSS stream as a string
result = doInBackground(petrolPriceURL);
response.setText(result);
Log.v(TAG, "index=" + result);
}
catch(Exception ae)
{
// Handle error
errorText.setText("Error");
// Add error info to log for diagnostics
errorText.setText(ae.toString());
}
if(dialog.getProgress() == dialog.getMax())
dialog.dismiss();
}
}
if someone could point out my error as well as show an example of where the code is suppose to go in my doInBackground that would be great. 如果有人可以指出我的错误以及显示代码应该放在doInBackground中的示例,那将很棒。 Thanks
谢谢
problem: 问题:
result = doInBackground(petrolPriceURL);
you are implicitly calling the doInbackground
method in the onPostExecute
which will actually run in your UI thread instead on a different thread thus resulting to Android:NetworkOnMainThreadException
. 你是隐式调用
doInbackground
的方法onPostExecute
这将在实际UI线程,而不是在不同的线程从而导致运行Android:NetworkOnMainThreadException
。
Also it is unnecessary to call doInBackground
that it is already executed before onPostExecute
when you execute your Asynctask
. 此外,它不需要调用
doInBackground
它之前已经执行onPostExecute
当您执行Asynctask
。 Just directly use the result
parameter of the onPostExecute
. 只需直接使用
result
的参数onPostExecute
。
sample: 样品:
@Override
protected void onPostExecute(String result) {
// Get the data from the RSS stream as a string
errorText = (TextView)findViewById(R.id.error);
response = (TextView)findViewById(R.id.title);
response.setText(result);
if(dialog.getProgress() == dialog.getMax())
dialog.dismiss();
}
I suspect the error is related to this part of your code: 我怀疑该错误与您的代码的这一部分有关:
try
{
// Get the data from the RSS stream as a string
result = doInBackground(petrolPriceURL);
response.setText(result);
Log.v(TAG, "index=" + result);
}
doInBackgound is called automatically when you call asynctask.execute. 当您调用asynctask.execute时,会自动调用doInBackgound。 To start your task correctly you should (1) create a new instance of your task;
要正确启动任务,您应该(1)创建任务的新实例; (2) pass the string params you need to use in doInBackground in the execute method;
(2)在execute方法中的doInBackground中传递您需要使用的字符串参数; (3) use them;
(3)使用它们; (4) return the result to onPostExecute.
(4)将结果返回给onPostExecute。
For Example: 例如:
//in your activity or fragment
MyTask postTask = new MyTask();
postTask.execute(value1, value2, value3);
//in your async task
@Override
protected String doInBackground(String... params){
//extract values
String value1 = params[0];
String value2 = params[1];
String value3 = params[2];
// do some work and return result
return value1 + value2;
}
@Override
protected void onPostExecute(String result){
//use the result you returned from you doInBackground method
}
You should try to do all of your "work" in the doInBackground method. 您应该尝试在doInBackground方法中完成所有“工作”。 Reutrn the result you want to use on the main/UI thread.
返回要在主/ UI线程上使用的结果。 This will automaticlly be passed as an argument to the onPostExecute method (which runs on the main/UI thread).
这将自动作为参数传递给onPostExecute方法(在主/ UI线程上运行)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.