【问题标题】:Android: What is the right approach to returning values from an anonymous class to thread?Android:将值从匿名类返回到线程的正确方法是什么?
【发布时间】:2017-06-28 19:07:29
【问题描述】:

getVehicleName() 函数需要什么修改才能正确返回车辆名称给父线程?最好的方法是什么?我尝试了处理程序和回调函数,但最终出现编译时错误(“尝试分配较弱的访问权限”)。

父函数(完整代码未粘贴)

Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                try {

                    boolean val = checkifVehicleAvailable("1111A");
                } catch (Exception e){
                }
            });

功能

 public boolean checkifVehicleAvailable(String drive_this) {

     if( getVehicleName(drive_this).equals("1111A"){     
     return true;
     }
     return false;
}

// Need to be modified to return String 

public String getVehicleName(String ID){
    /*DB references*/
    //final String vehicleName;
    FirebaseDatabase database = FirebaseDatabase.getInstance();
    DatabaseReference myRef;
    DatabaseReference childRef;

    myRef = database.getReference();
    childRef = myRef.child("vehicles");
    childRef.child(ID).addListenerForSingleValueEvent(new ValueEventListener() {
        String vehicleSecretName;
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
             vehicleName = dataSnapshot.child("vehicleName").getValue(String.class);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}

【问题讨论】:

  • 请格式化您的代码。在第一部分中,您使用try 而不使用catch。你写了getVehicleName(drive_this).equals("1111A"),但是getVehicleName 是无效的。
  • 已编辑。我正在寻找正确的方法来修改 getVehicleName() 以从 firebase DB 返回字符串值。

标签: java android anonymous-class


【解决方案1】:

您可以将值保存在 SharedPreferences 中并注册一个 SharedPreferenceListener 以在某个值发生更改时通知此侦听器。监听器可能看起来像这样:

@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
     if(key.equals("myKey") { 
        sharedPreferences.getString(key); 
        //do whatever after that > e.g. start your async task or load that value into an AsyncTask via execute(..) method.
     }
}

【讨论】:

    【解决方案2】:

    例如,你可以说:

        final boolean[] result = new boolean[1];
    
        Thread t = new Thread(new Runnable() {
    
        @Override
        public void run() {
            try {
                boolean val = foo();
                result [0] = val;
            } catch (Exception e){
    
            }
        });
     }
    
    private boolean foo(){
        return false;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-25
      • 2013-03-22
      • 2013-09-12
      • 2019-09-05
      • 1970-01-01
      • 2021-06-10
      相关资源
      最近更新 更多