2017-04-13 58 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); 
} 

}

希望它能帮助。

相关问题