2013-04-25 31 views
2

我开发一个Android应用程序,当它启动:使用另一个线程的“网络”,在Android的

1)我做一个HTTP请求到我的服务器发送一个小的JSON文件。

2)打开webView显示URL。

当服务器正常运行时,绝对没有问题,一切都很顺利。

无论其,如果出于任何原因,服务器宕机,HTTP请求字面上挂起,我需要等待,直到有一个HTTP超时是围绕30秒直到我真正看到的URL加载web视图。

我读过,我不应该在UI线程中做任何联网,我应该使用另一个线程。

在黑莓手机,我已经开发的应用来说,这是这么简单:

new Thread(){ 
    public void run(){ 
    HttpConnection hc = 
      (HttpConnection)Connector.open("http://www.stackoverflow.com"); 
    } 
}.start(); 

我刚开始一个新的线程和内我发出请求和所有必要的网络。这样,即使我的服务器无法访问,webView也会立即加载,而不会让用户等待,并感觉应用程序实际挂起。

我怎么能在Android中完全相同,最简单的方式吗?

回答

4

为什么不使用用于BlackBerry的相同方法?

new Thread() { 
    public void run() { 
    new URL("http://www.stackoverflow.com").getContent(); 
    } 
}.start(); 
+0

哇,实际工作!!!!!它是完全正确的吗?这么简单吗? – donparalias 2013-04-25 11:20:58

+0

如果之后不需要与UI进行交互,没有任何问题。如果你这样做 - 最好使用AsyncTask。 – MatrixDev 2013-04-25 11:34:45

+0

那么我只与已经打开的webView进行交互。所以没关系我猜 – donparalias 2013-04-25 11:36:01

1

在冰淇淋三明治和以上,你不能在UI线程中使用任何web cal。不过你可以使用线程,但android提出的最好的方法是使用异步任务。一个非常简单的例子如下。

“的AsyncTask <参数类型,进展值类型,返回类型>”

class MyAsyncTask extends AsyncTask<String, String, String> { 

    @Override 
    protected void onPreExecute() { 
    // Runs on UI thread- Any code you wants 
    // to execute before web service call. Put it here. 
    // Eg show progress dialog 
    } 
    @Override 
    protected String doInBackground(String... params) { 
     // Runs in background thread 
     String result = //your web service request;   

     return result; 
    } 

    @Override 
    protected void onProgressUpdate(String... values) { 
     super.onProgressUpdate(values); 
    } 

    @Override 
    protected void onPostExecute(String resp) { 

     // runs in UI thread - You may do what you want with response 
     // Eg Cancel progress dialog - Use result   
    } 

} 
+0

谁告诉你,你不能在UI线程中使用Web调用?那究竟是什么意思?我刚刚在4.1.2上测试过它,它工作正常 – donparalias 2013-04-25 11:33:56

+0

我的意思是你不能直接调用Web服务,但在线程中。例如。您无法直接在任何UI方法中调用Web服务。您必须在该方法内创建一个线程或使用asynctask。 – Adnan 2013-04-25 12:06:18