我想检索this file的内容并将其保存为字符串。
我尝试过使用AsyncTask(基于this answer),这是我的课程。
class RetreiveURLTask extends AsyncTask<Void, Void, String> {
private Exception exception = null;
public String ResultString = null;
protected String doInBackground(Void ... something) {
URL url;
try {
url = new URL("http://stream.lobant.net/ccfm.info");
HttpURLConnection urlConnection;
urlConnection = (HttpURLConnection) url.openConnection();
InputStream in = new BufferedInputStream(urlConnection.getInputStream());
String stream_url = IOUtils.toString(in, "UTF-8");
urlConnection.disconnect();
return stream_url;
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
} catch (Exception e) {
this.exception = e;
return null;
}
}
protected void onPostExecute(String stream_url) {
// TODO: check this.exception
// TODO: do something with the feed
if (this.exception != null)
this.exception.printStackTrace();
this.ResultString = stream_url;
}
}
我尝试过使用我的AsyncTask类:
AsyncTask<Void, Void, String> stream_task = new RetreiveURLTask().execute();
String stream_url = stream_task.ResultString;
但无法识别ResultString。
我对这一切的运作方式感到困惑。由于AsyncTask在后台运行,即使我可以将我的字符串分配给其中一个公共变量,也没有保证它在我进行赋值时有效。即使我要使用某种getResult()函数,我也需要知道何时调用它以便代码完成执行。
那么,这通常是怎么做的?
(另外,我的http读取代码好吗?)
我的能力:我可以编码,但我不熟悉android。
答案 0 :(得分:9)
使用界面
new RetreiveURLTask(ActivityName.this).execute();
在你的asyctask中
TheInterface listener;
在构造函数
中 public RetreiveURLTask (Context context)
{
listener = (TheInterface) context;
}
界面
public interface TheInterface {
public void theMethod(String result);
}
在onPostExecute
if (listener != null)
{
listener.theMethod(stream_url);
}
在您的活动类中实现接口
implements RetreiveURLTask.TheInterface
实施方法
@Override
public void theMethod(String result) {
// update ui using result
}
答案 1 :(得分:4)
// try this way
RetreiveURLTask task = new RetreiveURLTask();
task.execute();
private void response(String responseData){
// here you write your code which use responseData
}
class RetreiveURLTask extends AsyncTask<Void, Void, String> {
private Exception exception = null;
public String ResultString = null;
protected String doInBackground(Void ... something) {
URL url;
try {
url = new URL("http://stream.lobant.net/ccfm.info");
HttpURLConnection urlConnection;
urlConnection = (HttpURLConnection) url.openConnection();
InputStream in = new BufferedInputStream(urlConnection.getInputStream());
String stream_url = IOUtils.toString(in, "UTF-8");
urlConnection.disconnect();
return stream_url;
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
} catch (Exception e) {
this.exception = e;
return null;
}
}
protected void onPostExecute(String stream_url) {
// TODO: check this.exception
// TODO: check this.exception
// TODO: do something with the feed
super.onPostExecute(stream_url);
response(stream_url)
}
}
答案 2 :(得分:1)
制作本
public String ResultString = "";
全球
Asynctask不是这里的主要类,这就是你获得ResultString cannot be resolved or is not a field
将其设为全局变量,然后您就可以访问它了
答案 3 :(得分:0)
AsyncTask的执行在后台启动,而赋值在执行开始后立即执行。因此,在AsyncTask执行完成之前执行赋值。
最好的办法是在OnPostExecute()方法中进行分配。