【问题标题】:Android - View.post() does not modify TextView from onCreate()Android - View.post() 不会从 onCreate() 修改 TextView
【发布时间】:2015-07-12 04:54:17
【问题描述】:

为什么这不会改变我的 TextView 的文本?我有一个 TextView 我尝试从 view.post 方法修改的文本。我在这里做错了什么?

mTextView = (TextView)findViewById(R.id.text_view);

new Thread(new Runnable() {
    @Override
    public void run() {
        mTextView.post(new Runnable(){
            @Override
            public void run() {
                mTextView.setText("A change in text, thank you very much");
            }
        });
    }
}).start();

这在 Activity 的 onCreate() 方法中运行。但是,如果我定义一个处理程序并将 Runnable 传递给处理程序,则 TextView 会被修改。

编辑: 我这里的代码基于示例:

public void onClick(View v) {
    new Thread(new Runnable() {
        public void run() {
            final Bitmap bitmap =
                    loadImageFromNetwork("http://example.com/image.png");
            mImageView.post(new Runnable() {
                public void run() {
                    mImageView.setImageBitmap(bitmap);
                }
            });
        }
    }).start();
}

http://developer.android.com/guide/components/processes-and-threads.html

编辑 2: 现在我完全糊涂了。当我从附加到 Activity 中的按钮的 onClickListener 运行相同的代码时,TextView 的文本确实被操纵了。为什么onCreate 方法中没有发生这种情况?

【问题讨论】:

标签: android view java-threads


【解决方案1】:

要更新活动中的文本视图,您必须使用 runOnUiThread

runOnUiThread(new Runnable() {
    @Override 
    public void run() { 
        mTextView.setText("A change in text, thank you very much"); 
    }
}); 

您可以使用 With 使用 AsycTask 在 Imageview 中加载您的图片

public class ImageLoadTask extends AsyncTask<Void, Void, Bitmap> {

    private String url;
    private ImageView imageView;

    public ImageLoadTask(String url, ImageView imageView) {
        this.url = url;
        this.imageView = imageView;
    } 

    @Override 
    protected Bitmap doInBackground(Void... params) {
        try { 
            URL urlConnection = new URL(url);
            HttpURLConnection connection = (HttpURLConnection) urlConnection
                    .openConnection();
            connection.setDoInput(true);
            connection.connect();
            InputStream input = connection.getInputStream();
            Bitmap myBitmap = BitmapFactory.decodeStream(input);
            return myBitmap;
        } catch (Exception e) {
            e.printStackTrace();
        } 
        return null; 
    } 

    @Override 
    protected void onPostExecute(Bitmap result) {
        super.onPostExecute(result);
        imageView.setImageBitmap(result);

       // you can also update your textview here 

    } 

} 

并在您的 Onclick 上调用此任务

button.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // pass your url and your imageview 
                // eg :http://example.com/image.png
                // imageView=(your ImageView)
                   new ImageLoadTask(url, imageView).execute();
            }
        });

【讨论】:

  • 感谢它按预期工作。但是我试图使用后台线程中的 View.post 来实现相同的结果。 post() 方法不是默认在 UI 线程上运行的吗?
  • 能否请您看看我所做的编辑。从附加到 Button 的 onClickListener 执行相同的代码会修改 TextView 的文本。为什么在 onCreate 方法中没有发生这种情况?
【解决方案2】:

为什么你在另一个线程中运行你的代码?所有 UI 操作仅在 UI 线程中起作用..尝试仅执行以下代码

mTextView = (TextView)findViewById(R.id.text_view);
mTextView.post(new Runnable() {
    @Override
    public void run() {
        mTextView.setText("A change in text, thank you very much");
    }
});

【讨论】:

  • 我在这里有点困惑。如果我想使用 View.post 从后台线程操作我的 TextView 怎么办? Runnable 本身不是线程,但我需要根据在后台线程中获得的结果设置 TextView 的文本。如何实现?
  • 请您看看我对这个问题所做的修改。我尝试从附加到我的 UI 中的按钮的 onClickListener 执行相同的代码,并且确实操纵了 TextView 的文本。为什么这在 onCreate 中没有发生?
【解决方案3】:

在没有new Thread(new Runnable()的情况下运行

     mTextView.post(new Runnable(){

         @Override
         public void run() {

             // anything you want
         }
     });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-05
    相关资源
    最近更新 更多