1

这是我到目前为止得到的东西,这是我的应用程序,它所做的只是显示一个数字时钟并每 30 秒将时钟移动到屏幕的一个新部分,但它实际上并没有做最后一部分,这是代码:

public class MainActivity extends Activity {

private Runnable runnable = new Runnable(){
    @Override
    public void run() {         
        handler.sendEmptyMessage(0);
    }
};
Handler handler = new Handler() {       
    @Override
    public void handleMessage(Message msg) {            
        //change the text position here         
        this.postDelayed(runnable , 30000);
        }
    }; 

@Override
protected void onCreate(Bundle savedInstanceState) {


    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    TextView textView = (TextView) findViewById(R.id.digitalClock);  
    Random r = new Random();

    Thread thread =new Thread(runnable );
    thread.start();

    int x = r.nextInt(350 - 100);
    int y = r.nextInt(800 - 100);

    textView.setX(x);  
    textView.setY(y);
    }

我似乎无法让它工作,现在已经扫描了大约一个星期的互联网。我认为这与“新线程”有关,但不太确定是什么。

4

2 回答 2

2

无需创建额外的Runnable实例或您自己的线程。

在该onCreate方法中,您要做的就是调用setContentView并向处理程序发送一条空消息。

handleMessage您的实例的方法中Handler,设置 TextView 的 X 和 Y 并延迟发布另一条空消息。

这是一个可以做你想做的事情的活动。它使用 anAbsoluteLayout来对不推荐使用的进行绝对定位TextView,但它应该展示Handler您问题的核心部分。

package com.scompt.so16209790;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.widget.TextView;

import java.lang.ref.WeakReference;
import java.util.Random;

public class MainActivity extends Activity {
    private static final Random RANDOM = new Random();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Handler handler = new RandomMoveHandler((TextView) findViewById(R.id.text_view));
        handler.sendEmptyMessage(0);
    }

    // Make the handler subclass static because of this: http://stackoverflow.com/a/11408340/111777
    private static class RandomMoveHandler extends Handler {
        private final WeakReference<TextView> textViewWeakReference;

        private RandomMoveHandler(TextView textView) {
            this.textViewWeakReference = new WeakReference<TextView>(textView);
        }

        @Override
        public void handleMessage(Message msg) {
            TextView textView = textViewWeakReference.get();
            if (textView == null) {
                Log.i(TAG, "WeakReference is gone so giving up.");
                return;
            }

            int x = RANDOM.nextInt(350 - 100);
            int y = RANDOM.nextInt(800 - 100);

            Log.i(TAG, String.format("Moving text view to (%d, %d)", x, y));
            textView.setX(x);
            textView.setY(y);

            //change the text position here
            this.sendEmptyMessageDelayed(0, 3000);
        }
    }

    private static final String TAG = MainActivity.class.getSimpleName();
}

main布局如下所示:

<?xml version="1.0" encoding="utf-8"?>
<AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView
        android:id="@+id/text_view"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_x="0px"
    android:layout_y="0px"
    android:text="Hello World, MainActivity"
    />
</AbsoluteLayout>
于 2013-04-25T08:31:46.647 回答
0

我对您的解决方案有点好奇,我不想在 Android 应用程序中使用 Thread,您可以改为触发 Handler。这是示例

Handler handler = new Handler() {
@Override public void handleMessage(Message msg) {
// 你的工作
} };

然后在活动中,您可以在需要的地方发布AtTime方法。

于 2013-04-25T08:30:41.590 回答