0

我正在尝试使用 HttpGet 和 HttpClient 从 Internet 获取数据。但是,当我在模拟器中运行它时,它会立即关闭并说“不幸的是,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;
}

日志猫:

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
4

3 回答 3

1

android.os.NetworkOnMainThreadException

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

您必须将所有与Http相关的调用onCreate()移至AsyncTask.

于 2013-03-08T04:01:12.513 回答
0

Here is the great example by vogela to understand how to use AsynckTask in android.

You can go threw it and put your network relatd call in doBackground of that task.

Hope you got the point.

于 2013-03-08T04:14:30.217 回答
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

于 2013-03-08T04:13:17.057 回答