2017-04-13 84 views
-2

我試圖將本地主機(wamp服務器)上的文本文件的內容作爲字符串返回。我可以讀取文本文件,但無法返回字符串,因爲Runnable的函數運行是無效的。我正在開發Android Studio(這就是爲什麼我使用線程)。返回本地主機上的文本文件的內容

public String serverToString() 
{ 
    String str; 
    Thread t = new Thread(new Runnable() { 
     public void run() { 
      try { 
       URL url = new URL("http://myIP/test.txt"); 
       BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream())); 
       str = in.readLine(); 
       in.close(); 
      } catch (MalformedURLException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } catch (Throwable th) { 
       th.printStackTrace(); 
      } 
     } 
    }); 
    t.start(); 
    return str; 
} 
+0

你試圖實現的是不可能的。你不能從**異步**方法返回任何參數。 –

+0

使用volley進行服務器調用,並在您希望使用該字符串的同一類中進行調用,可以使用全局變量或setter來傳遞該值。 –

回答

0

通常,Volley庫將優於原始線程。或的AsyncTask

,但我不能返回一個字符串,因爲Runnable接口的功能來看是無效

您可以結果到一個新的方法,雖然。

定義一個接口

public interface ServerResponse { 
    void onResponse(String msg); 
} 

添加參數

public void serverToString(final ServerResponse callback) 
{ 
    String str; 
    Thread t = new Thread(new Runnable() { 
     public void run() { 
      try { 
       URL url = new URL("http://myIP/test.txt"); 
       BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream())); 
       callback.onResponse(in.readLine()); // This is the 'return' now 
       in.close(); 
      } catch (MalformedURLException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } catch (Throwable th) { 
       th.printStackTrace(); 
      } 
     } 
    }); 
    t.start(); 
} 

而不是這個

String response = serverToString(); 

做這個

serverToString(new ServerResponse() { 
    @Override 
    public void onResponse(String response) { 
     // handle message 
    } 
}); 
+0

我試過這個,但它不工作,因爲我不能在運行函數中使用回調(它不能被修改)。 –

+0

參數需要是最終的...'serverToString(最終ServerResponse' –

+0

或者,你應該閱讀關於網絡的Android文檔並使用Volley庫 –

0

推進板球答案,我通常創建一個AsyncTask,並在其中定義一個回調接口。 執行此任務的活動應實現此接口。 As的代碼的一部分的例子:

公共類TeamUpdateTask延伸的AsyncTask,對象,TeamUpdateResponse> {

private TeamUpdateTaskCallback mListener; 


@Override 
public void onPostExecute (TeamUpdateResponse result) { 
    if (exception == null) { 
     mListener.OnTeamUpdateCompleted(result); 
    } else { 
     processException(); 
    } 
} 

public void setListener (TeamUpdateTaskCallback listener) { 
    mListener = listener; 
} 

public interface TeamUpdateTaskCallback { 
    void OnTeamUpdateCompleted (TeamUpdateResponse response); 
} 

}

希望它能幫助。

相關問題