2014-02-22 69 views
1

我是新来的android和开发测试应用程序来击中服务器并获得json响应。 这里是我的主要活动 -NetworkOnMainThreadException尽管AsyncTask

public class MainPageActivity extends Activity { 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.welcome_layout); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.options_menu, menu); 
    MenuItem searchItem = menu.findItem(R.id.search); 
    SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem); 

    SearchView.OnQueryTextListener queryTextListener = new SearchView.OnQueryTextListener() { 
     @Override 
     public boolean onQueryTextChange(String newText) { 
      return false; 
     } 

     @Override 
     public boolean onQueryTextSubmit(String query) { 
      new DownloadWebpageTask().doInBackground("http://49.139.144.194:8080/ServerForMyAndroid/MusicServlet"); 
      return false; 
     } 
    }; 
    searchView.setOnQueryTextListener(queryTextListener); 
    return super.onCreateOptionsMenu(menu); 
} 

}

而且的AsyncTask类是 -

public class DownloadWebpageTask extends AsyncTask<String, Void, String> { 
@Override 
protected void onPostExecute(String result) { 
    ResultMainVO resultVO = new Gson().fromJson(result, ResultMainVO.class); 
    System.out.println("test" + resultVO); 
} 

@Override 
protected String doInBackground(String... urls) { 
    InputStream is = null; 
    StringBuilder builder = new StringBuilder(); 

    try { 
     URL url = new URL(urls[0]); 
     HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
     conn.setReadTimeout(10000 /* milliseconds */); 
     conn.setConnectTimeout(15000 /* milliseconds */); 
     conn.setRequestProperty("Accept", "*/*"); 
     conn.setDoInput(true); 
     conn.connect(); 
     is = conn.getInputStream(); 
     BufferedReader reader = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8"))); 
     String line; 
     while ((line = reader.readLine()) != null) { 
      builder.append(line); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     if (is != null) { 
      try { 
       is.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
    return builder.toString(); 
} 

}

我还增加了在AndroidManifest.xml的权限文件 -

我得到下面的excep和灰当我运行emulator-

该应用 02-22 21:49:41.989:E/AndroidRuntime(734):致命异常:主 02-22 21:49:41.989:E/AndroidRuntime(734) :android.os.NetworkOnMainThreadException 02-22 21:49:41.989:E/AndroidRuntime(734):在android.os.StrictMode $ AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1084)

回答

7

更改此

new DownloadWebpageTask().doInBackground("http://49.139.144.194:8080/ServerForMyAndroid/MusicServlet"); 

new DownloadWebpageTask().execute("http://49.139.144.194:8080/ServerForMyAndroid/MusicServlet"); 
+2

事实上,我们不能直接调用背景方法,因为这样做会在调用(可能是UI)线程上运行它。 –

+0

非常感谢。不知怎的,我错过了这个! –

相关问题