如何将变量传递给此run()函数?

时间:2015-08-06 11:15:18

标签: java android multithreading runnable picasso

我在这里讨论的课程来自Picasso Lib for Android。 我在这个函数中有一个名为“ImageName”的变量。 但是我似乎无法弄清楚如何将参数传递给函数来更改变量名称。我已经尝试过扩展Target类,但我似乎仍然遇到错误而且我还不够先进,无法知道我做错了什么。

public interface TargetImageName extends Target
{

    public void TargetImageName(String ImageName);

    @Override
    void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from);

    @Override
    void onBitmapFailed(Drawable errorDrawable);

    @Override
    void onPrepareLoad(Drawable placeHolderDrawable);
}

private TargetImageName target2 = new TargetImageName() {
    String name;
    @Override
    public void TargetImageName(String ImageName) {
        name = ImageName;
    }

    @Override
    public void onBitmapLoaded(final Bitmap bitmap, Picasso.LoadedFrom from) {
        new Thread(new Runnable() {
            @Override
            public void run() {

                File file = new File(
                        Environment.getExternalStorageDirectory().getPath()
                                + name);//+ "/saved.jpg");
                try {
                    file.createNewFile();
                    FileOutputStream ostream = new FileOutputStream(file);
                    bitmap.compress(Bitmap.CompressFormat.JPEG,100,ostream);
                    ostream.close();
                }
                catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }

    @Override
    public void onBitmapFailed(Drawable errorDrawable) {}

    @Override
    public void onPrepareLoad(Drawable placeHolderDrawable) {}
};

//同时我还有什么......

                int mode4 = Activity.MODE_PRIVATE;
                SharedPreferences data = getSharedPreferences("data", mode4);
                Integer coins = data.getInt("coins", 0);
                String coinsString = coins.toString();
                TextView coinView = (TextView) findViewById(R.id.coins);
                coinView.setText(coinsString);

2 个答案:

答案 0 :(得分:5)

您不能将任何内容传递给run(),因为它不需要参数。你应该做的只是扩展Runnable并通过构造函数传递你需要的任何东西:

public class MyRunnable implements Runnable {
     protected Integer mFoo;

     public MyRunnable(Integer foo) { 
        mFoo = foo;
     }

     @Override
     public void run() {
          // access mFoo when you need it
           ...
     }
}

然后

...
 new Thread(new MyRunnable(...)) {
    ...

答案 1 :(得分:0)

创建一个实现Target的类。

而不是另一个接口
public class TargetImageName implements Target
    {
        String name;
        public  TargetImageName(String ImageName) {
            name = ImageName;
        }
        @Override
        public void onBitmapFailed(Drawable errorDrawable) {

        ...}
        @Override
        public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
        ...}

        @Override
        public void onPrepareLoad(Drawable placeHolderDrawable) {
        ...}
    }

现在创建一个对象并将其作为Picasso回调对象传递

Picasso.with(getActivity()).load(<url>).into(new TargetImageName(<parameter>));