Java 下载大量数据时无响应的应用程序

Java 下载大量数据时无响应的应用程序,java,android,oncreate,Java,Android,Oncreate,我有一个应用程序,必须在应用程序启动时从服务器下载几MB(1MB-10MB)的数据 问题在于该应用程序: 开始下载前不显示主TextView(屏幕保持黑色) 他或多或少没有反应 代码如下: public class Main extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);

我有一个应用程序,必须在应用程序启动时从服务器下载几MB(1MB-10MB)的数据

问题在于该应用程序:

  • 开始下载前不显示主
    TextView
    (屏幕保持黑色)

  • 他或多或少没有反应

代码如下:

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

    private void DoIt() {

        HttpClient httpClient = new DefaultHttpClient();

        TextView tv = (TextView)findViewById(R.id.textView);
        tv.setText("Starting app...");

        try {        
            for (int i=1; i<100; i++) {
                HttpPost request2 = new HttpPost("http://192.168.1.12:3000/bytes/data" + i);            
                HttpResponse response2 = httpClient.execute(request2);

               // Do something with data. In some cases, it has to download 1MB data
            } 
        }

        // catch + finally ...
    }
}
public类主扩展活动{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
DoIt();
}
私有无效DoIt(){
HttpClient HttpClient=新的DefaultHttpClient();
TextView tv=(TextView)findViewById(R.id.TextView);
tv.setText(“启动应用程序…”);
试试{

对于(inti=1;i您的应用程序变得不负责任,因为您正在下载主线程中的文件,您应该像这样使用后台线程

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

    TextView tv = (TextView)findViewById(R.id.textView);
    tv.setText("Starting app...");

    new Thread(new Runnable() {
        @Override
        public void run() {
            DoIt();
        }
    }).start();

}

 private void DoIt() {

    HttpClient httpClient = new DefaultHttpClient();

    try {        
        for (int i=1; i<100; i++) {
            HttpPost request2 = new HttpPost("http://192.168.1.12:3000/bytes/data" + i);            
            HttpResponse response2 = httpClient.execute(request2);

           // Do something with data. In some cases, it has to download 1MB data
        } 
    }

    // catch + finally ...
}
@覆盖
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView tv=(TextView)findViewById(R.id.TextView);
tv.setText(“启动应用程序…”);
新线程(newrunnable()){
@凌驾
公开募捐{
DoIt();
}
}).start();
}
私有无效DoIt(){
HttpClient HttpClient=新的DefaultHttpClient();
试试{

对于(int i=1;iYou应该使用一个后台线程来进行网络操作。@codeMagic可以,但是stlil,为什么不
tv.setText(“启动应用程序…””);
显示?(它应该在下载开始之前显示)。按照@codeMagic所说的做,你就可以设置文本。你可以用AsynTask轻松地完成它。
tv.setText(“正在启动应用程序…”;
没有显示,因为在你陷入主线程困境之前,用户界面还没有机会更新。@克里斯蒂安,有没有代码示例说明你将如何操作?谢谢!我看到它开始了,我看到文本视图中有文本,然后我很快得到
不幸的是,应用程序停止了
。知道吗?我在
中看到了数千行ogcat
,是否有办法只显示我的(崩溃)应用程序?你必须看到导致停止的异常,阅读你将找到的日志和异常名称,如果你点击它,你还会找到行号。问题是,
adb logcat
实时生成大量行,我看不到相关行。有没有办法过滤与特定行相关的消息ic应用程序(可能这在AndroidStudio中是直接可能的,但我不使用它)您只需仔细阅读日志并检测错误,这是唯一的解决方案