0

タイマーを使用してインターネットから画像を更新しようとしています。

これは私のコードです:

public class ProjectActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    BannerActivity ba = new BannerActivity(this);
    LinearLayout layout = (LinearLayout)findViewById(R.id.main_layout);
    layout.addView(ba);
}

public class BannerActivity extends ImageButton implements OnClickListener{
    URL url = null;
    public BannerActivity(Context context) {
        super(context);
        setLayoutParams(new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 300));
        loadimage();
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            public void run() {
                loadimage();
            }   
            }, 5000, 1000);
    }

    private void loadimage(){
        try {
            url = new URL("http://3.bp.blogspot.com/_9UYLMDqrnnE/S4UgSrTt8LI/AAAAAAAADxI/drlWsmQ8HW0/s400/sachin_tendulkar_double_century.jpg");
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        InputStream content = null;
        try {
            content = (InputStream)url.getContent();
        } catch (IOException e) {
            e.printStackTrace();
        }
        final Drawable d = Drawable.createFromStream(content , "src"); 
        setBackgroundDrawable(d);

        setOnClickListener(this);
    }

私が得ているエラーはこれです:

CalledFromWrongThreadException: Only the original thread that created a view
hierarchy can touch its views.

私はこれが初めてで、それが何を意味するのか、どのように修正するのかわかりません。

4

2 に答える 2

1

Android では不可能な UI フォームを非 UI スレッドに変更しようとしています。このメソッドを呼び出す代わりに setBackgroundDrawable(d); Timer の run メソッド内で、runonUiThread() 内に囲みます。

contextObj.runOnUiThread(new Runnable() {

        public void run() {
            // TODO Auto-generated method stub
            setBackgroundDrawable(d);
        }
    });

あなたのアクティビティのコンテキストを取得してから、 LoadImage() を次のように変更してみてください。

private void loadimage(){
    try {
        url = new URL("http://3.bp.blogspot.com/_9UYLMDqrnnE/S4UgSrTt8LI/AAAAAAAADxI/drlWsmQ8HW0/s400/sachin_tendulkar_double_century.jpg");
    } catch (MalformedURLException e) {
        e.printStackTrace();
    }
    InputStream content = null;
    try {
        content = (InputStream)url.getContent();
    } catch (IOException e) {
        e.printStackTrace();
    }
    final Drawable d = Drawable.createFromStream(content , "src"); 
    contextObj.runOnUiThread(new Runnable() {

        public void run() {
            // TODO Auto-generated method stub
            setBackgroundDrawable(d);
        }
    });


    setOnClickListener(this);
}
于 2012-06-18T09:21:45.217 に答える
0

アクティビティ クラスはスレッドです。Handler なしでアクティビティ内にスレッドを作成しようとすると、ThreadException が発生します。したがって、この新しいスレッドを処理するハンドラを追加します。

ありがとう

于 2012-06-18T09:22:53.110 に答える