尝试从互联网上获取数据时Android App停止了

时间:2013-03-08 03:59:21

标签: android httpclient http-get

我正在尝试使用HttpGet和HttpClient从互联网上获取数据。但是,当我在我的模拟器中运行它时,立即关闭说“不幸的是,AppName已停止”。任何想法如何解决这个问题?

守则:

public class MainActivity extends Activity {

    final String httpPath = "http://www.google.com";    


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TextView txtContent = (TextView) findViewById(R.id.txtContent);

        TextView tvHttp = (TextView) findViewById(R.id.tvHttp);

        HttpClient httpclient = new DefaultHttpClient();
        HttpGet httpget = new HttpGet(httpPath);
        try {

            HttpEntity httpEntity = httpclient.execute(httpget).getEntity();

           if (httpEntity != null){
            InputStream inputStream = httpEntity.getContent();
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
            StringBuilder stringBuilder = new StringBuilder();

            String line = null;

            while ((line = bufferedReader.readLine()) != null) {
                stringBuilder.append(line + "\n");
            }

            inputStream.close();

            tvHttp.setText(stringBuilder.toString());
           }

        } catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            Toast.makeText(MainActivity.this, e.toString(), Toast.LENGTH_LONG).show();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            Toast.makeText(MainActivity.this, e.toString(), Toast.LENGTH_LONG).show();
      }
AssetManager assetManager = getAssets();


// To load text file
InputStream input;
try {
    input = assetManager.open("dummytext.txt");

     int size = input.available();
     byte[] buffer = new byte[size];
     input.read(buffer);
     input.close();

     // byte buffer into a string
     String text = new String(buffer);

     txtContent.setText(text);
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();}

}



@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

logcat的:

03-08 03:31:17.762: D/AndroidRuntime(892): Shutting down VM
03-08 03:31:17.762: W/dalvikvm(892): threadid=1: thread exiting with uncaught exception (group=0x40a71930)
03-08 03:31:17.952: E/AndroidRuntime(892): FATAL EXCEPTION: main
03-08 03:31:17.952: E/AndroidRuntime(892): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.appname/com.example.appname.MainActivity}: android.os.NetworkOnMainThreadException

3 个答案:

答案 0 :(得分:1)

android.os.NetworkOnMainThreadException

这意味着您正在Main UI主题上进行与网络相关的调用。

onCreate()中所有 Http 相关的来电都必须移至AsyncTask

答案 1 :(得分:0)

    class DownloadTask extends AsyncTask<Void,Void,Void>
{
  protected void onPreExecute() 
  {
  super.onPreExecute();  
    //show progress dialog()
  }

 @Override
 protected Void doInBackground(Void... params) {
   //get data form internet here
   // put all downloading related code in a method getDownload()
   // call  getDownload() here
 return null;
 }

 @Override
  protected void onPostExecute(Void result) {
  super.onPostExecute(result);
   //dismiss dialog update ui here
   // uodate ur ui with the downloaded data here
   }
 }

将以上内容用于AsyncTask

作为替代方案,您可以在githup中查看这个开源项目,该项目使用robospice进行长时间运行。 https://github.com/octo-online/robospice

答案 2 :(得分:0)

Here是vogela了解如何在Android中使用AsynckTask的好例子。

你可以扔掉它并将你的网络relatd调用放在该任务的doBackground中。

希望你明白这一点。