如何在类中使用runOnUiThread?

时间:2017-05-19 10:06:27

标签: android android-handler

我的代码旨在从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();
    }
}

3 个答案:

答案 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中设置上下文字段并在线程中使用它。

希望这会有所帮助。 :) 如果这解决了,请告诉我。