我的代码旨在从URL读取.txt文件,然后在textview中显示文本。问题是,我在一个类中使用此代码。并得到此错误 - “无法解析方法runOnUiThread”。我该如何解决这个问题?
public class mydownloaderclass {
// this method is called from MainActivity
public static void checkForUpdates(Context context) {
new Thread() {
@Override
public void run() {
String path ="http://host.com/info.txt";
URL u = null;
try {
u = new URL(path);
HttpURLConnection c = (HttpURLConnection) u.openConnection();
c.setRequestMethod("GET");
c.connect();
InputStream in = c.getInputStream();
final ByteArrayOutputStream bo = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
in.read(buffer); // Read from Buffer.
bo.write(buffer); // Write Into Buffer.
runOnUiThread(new Runnable() {
@Override
public void run() {
TextView text = (TextView) findViewById(R.id.TextView1);
text.setText(bo.toString());
try {
bo.close();
} catch (IOException e) {
e.printStackTrace();
}
}
});
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (ProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
}
}
我尝试使用asynctask
public class readtextfile extends AsyncTask<String, Integer, String> {
@Override
protected String doInBackground(String... params) {
String result = "";
try {
URL url = new URL("https://www.dropbox.com/myfile.txt");
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
String line = null;
while ((line = in.readLine()) != null) {
//get lines
result += line;
}
in.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
@Override
protected void onPostExecute(String result) {
Toast.makeText(context, result, Toast.LENGTH_LONG).show();
}
}
答案 0 :(得分:1)
创建一个Handler而不是像这样在主线程上执行语句
Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
@Override
public void run() {
//Write your RUN on UI Runnable code here
TextView text = (TextView) findViewById(R.id.TextView1);
text.setText(bo.toString());
try {
bo.close();
} catch (IOException e) {
e.printStackTrace();
} });
答案 1 :(得分:0)
我建议你使用AsyncTask,android使这个类专门用于在一个工作线程(doInBackgroung())上做一些任务,然后在onPostExecute()方法中更新UI。
答案 2 :(得分:0)
尝试传递视图上下文。它可以是定义文本视图的活动上下文。 runOnUiThread在主looper上运行,因此它需要UI上下文。 为此,您可以在定义Thread的类中定义成员字段,并在构造函数中对其进行设置。或者如果线程在活动本身中。然后只需在OnCreate中设置上下文字段并在线程中使用它。
希望这会有所帮助。 :) 如果这解决了,请告诉我。