2013-04-28 74 views
-1

我是一个开发人员android开发人员。我正在尝试此代码。但它总是陷入例外。但是,如果我删除BufferedReader,那么它工作正常。缓冲读者不工作

package com.toha.buffercheck;

import java.io.BufferedReader; 

import java.io.InputStreamReader; 

import java.net.URL; 

import java.net.URLConnection; 

import android.os.Bundle; 

import android.app.Activity; 

import android.view.Menu; 

import android.widget.EditText; 

import android.widget.TextView; 

public class Main extends Activity { 

EditText ets , etc; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     ets = (EditText) findViewById(R.id.editText1); 
     etc = (EditText) findViewById(R.id.editText2); 
     final TextView tv = (TextView) findViewById(R.id.textView1); 
     try { 
      URL url = null; 


      url = new URL("http://www.google.com"); 
      URLConnection conn = url.openConnection(); 
      BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream())); 
      tv.setText("Working Till Now"); 
     } 
     catch(Exception e) { 
      tv.setText("Stopped Working"); 
     } 
    } 

和logcat的口口声声说“该应用程序可能是太多的工作在其主线程”

PS:它工作正常,在模拟器版本2.3.3 但不能做仿真器版本4.2.2

+0

它不是在4.2.2版本的工作,因为自从Android 2.3版。 3你不能在主线程上执行网络工作。只需使用AsyncTask – Daniel 2013-04-28 05:44:58

回答

0

这里发生的事情很常见,您试图在应用程序的主线程上执行一些长时间运行的操作。

这是什么意思,主线程负责更新用户界面,强制执行顺畅的体验,如果android检测到你正在做一些长时间运行的操作将被阻止,它会强制关闭应用程序,让你知道这是不好的。

有很多替代解决方案,如AsynTask或IntentService。

IntentService是,当你发送一个意图它运行的服务:

public class NetworkHandler extends IntentService { 
    @Override 
    protected void onHandleIntent(Intent intent) { 
     //Do your request here 
    } 
} 

要激活IntentService,简单地做:

Intent intent = new Intent(mContext, NetworkHandler.class); 
startService(intent); 
+0

谢谢我会试试这个。 – 2013-04-28 05:56:17

2

错误:“该应用程序可能是太多在其主线程上工作“

不要屏蔽UI线程 不要访问Android从UI线程之外的UI工具包

工作线程

由于上述的单线程模型,这是你的应用程序的UI,你不会阻塞UI线程响应是至关重要的。如果您有要执行的操作不是即时的,则应确保在单独的线程(“后台”或“工作者”线程)中执行操作。

AsyncTask允许您在用户界面上执行异步工作。它在工作线程中执行阻塞操作,然后将结果发布到UI线程上,而无需您自己处理线程和/或处理程序。

不要在主线程中加载数据。使用其他线程的HTTP请求,例如:

new Thread(new Runnable() { 
    public void run() { 
     try { 
      URL url = null; 

      url = new URL("http://www.google.com"); 
      URLConnection conn = url.openConnection(); 
      BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream())); 
     } catch(Exception e) { 
      Log.i("Error on load data:", "" + e.getMessage()); 
     } 
    } 
}).start(); 

或者使用的AsyncTask负载数据:AsyncTask

Processes and Threads

+0

谢谢大家,我用AsyncTask来解决这个问题。 – 2013-04-28 07:02:56

+1

如果您在此找到答案,请考虑将其标记为已接受 – 2013-05-01 12:24:43