Android 如果我已经使用AsyncTask,如何避免主线程上的网络异常?

Android 如果我已经使用AsyncTask,如何避免主线程上的网络异常?,android,android-asynctask,networkonmainthread,asynctaskloader,Android,Android Asynctask,Networkonmainthread,Asynctaskloader,在我看来,我并不是真的从MainActivity调用URL、网络操作 我确实在另一个类ProcessData中调用了url.connect() 我确实使用doInBackground() 我确实使用AsyncTask扩展了ProcessData类 但例外情况仍然存在: public class MainActivity extends ActionBarActivity { private final String LOG_TAG = MainActivity.class.getS

在我看来,我并不是真的从MainActivity调用URL、网络操作

  • 我确实在另一个类ProcessData中调用了url.connect()
  • 我确实使用doInBackground()
  • 我确实使用AsyncTask扩展了ProcessData类
但例外情况仍然存在:

public class MainActivity extends ActionBarActivity {

    private final String LOG_TAG = MainActivity.class.getSimpleName();
    @Override
    protected void onCreate(Bundle savedInstanceState) {            
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ProcessData test = new ProcessData();
        test.doInBackground("mysql") ;
    }

//separate file ProcessData.java
public class ProcessData extends AsyncTask<String, Void, String> {

public String createValidUrl(String s){
       .....//code in this method works fine
}
public String doInBackground(String ...params){
        String validUrl = createValidURL(params[0]);                   
        HttpURLConnection urlConnection = null;
        BufferedReader reader = null;
        URL url = new URL(validUrl);
        urlConnection = (HttpURLConnection) url.openConnection();        
        urlConnection.setRequestMethod("GET");            
        urlConnection.connect();           

        InputStream inputStream = urlConnection.getInputStream();
        StringBuffer buffer = new StringBuffer();

        reader = new BufferedReader(new InputStreamReader(inputStream));

        String line;
            while((line = reader.readLine()) != null) {

                buffer.append(line + "\n");
            }
            urlConnection.disconnect();
            reader.close();

            return buffer.toString();
}
}
公共类MainActivity扩展了ActionBarActivity{
私有最终字符串LOG_TAG=MainActivity.class.getSimpleName();
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ProcessData测试=新的ProcessData();
test.doInBackground(“mysql”);
}
//单独文件ProcessData.java
公共类ProcessData扩展异步任务{
公共字符串createValidUrl(字符串s){
..…//此方法中的代码工作正常
}
公共字符串doInBackground(字符串…参数){
字符串validull=createvalidull(参数[0]);
HttpURLConnection-urlConnection=null;
BufferedReader reader=null;
URL=新的URL(validUrl);
urlConnection=(HttpURLConnection)url.openConnection();
urlConnection.setRequestMethod(“GET”);
urlConnection.connect();
InputStream InputStream=urlConnection.getInputStream();
StringBuffer=新的StringBuffer();
reader=新的BufferedReader(新的InputStreamReader(inputStream));
弦线;
而((line=reader.readLine())!=null){
buffer.append(第+行“\n”);
}
urlConnection.disconnect();
reader.close();
返回buffer.toString();
}
}
网络主线程异常仍然发生,我阅读了其他SO帖子。
我可以将我的http连接代码包装到新线程中,但我想准确地找出错误所在

您必须在
异步任务
上调用
执行
方法才能在后台线程中运行。您所做的是直接从主线程调用
doInBackground

您必须调用

test.execute();
而不是

test.doInBackground("mysql") ;

张贴stacktrace及其指向的行。@Niekharman,03-28 16:35:45.086:E/AndroidRuntime(1798):致命异常:main 03-28 16:35:45.086:E/AndroidRuntime(1798):在com.android.okhttp.internl.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:179)03-28 16:35:45.086:E/AndroidRuntime(1798):在com.example.kaban.it_ebooks2.ProcessData.doInBackground(ProcessData.java:130)上,基本上,它是doInBackground中的一行,inputstream=getinputstream(),因此execute()是隐式方法,包括doInBackground,后跟onPostExecute()?android就是这样工作的吗?@ERJAN-是的,你必须调用execute。它将负责调用onPreExecute(),然后是doInBackground(),然后是onPostExecute()。你的第一条评论是什么?你能再次发布评论吗。