runOnUiThread未定义类

时间:2012-04-03 11:09:45

标签: java android multithreading dialog

我正在尝试从我的后台线程抛出UI警告对话框,但是我遇到了runOnUiThread未定义的问题。我尝试了FindLocation.this.runOnUiThread和runOnUiThread,但两者似乎都抛出相同的错误The method runOnUiThread(new Runnable(){}) is undefined for the type new LocationListener(){}(或...the type FindLocation)。有什么想法吗?这是我的FindLocation.java类的片段。这是我的主要活动。

public class FindLocation extends Thread {

public boolean inJurisdiction;
public boolean AlertNotice = false;
private LocationManager locManager;
private LocationListener locListener;

Context ctx;
public String userId;

public FindLocation(Context ctx) {
     this.ctx = ctx;
}

 public void start(String userId) {
        this.userId = userId;
        super.start();

      }

@Override
public void run() {
     Looper.prepare();
    final String usr = userId;  

    //get a reference to the LocationManager
    locManager = (LocationManager) ctx.getSystemService(Context.LOCATION_SERVICE);

    //checked to receive updates from the position
    locListener = new LocationListener() {
        public void onLocationChanged(Location loc) {

            String lat = String.valueOf(loc.getLatitude()); 
            String lon = String.valueOf(loc.getLongitude());

            Double latitude = loc.getLatitude();
            Double longitude = loc.getLongitude();

            if (latitude >= 39.15296 && longitude >= -86.547546 && latitude <= 39.184901 && longitude <= -86.504288 || inJurisdiction != false) {
                Log.i("Test", "Yes");  

                inJurisdiction = true;

                FindLocation.this.runOnUiThread(new Runnable() { ///****error here****
                    public void run() {
                        AlertDialog.Builder alert = new AlertDialog.Builder(ctx);
                        alert.setTitle("Sent");
                        alert.setMessage("You will be contacted shortly.");
                        alert.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                           public void onClick(DialogInterface dialog, int which) {
                           }
                        });
                    }
                });

7 个答案:

答案 0 :(得分:31)

由于runOnUIThread()Activity的方法,因此您可以在构造函数中传递对调用活动的引用。

...
Context ctx;
Activity act;
public String userId;
...

public FindLocation(Context ctx, Activity act) {
    this.ctx = ctx;
    this.act = act;
}

并使用runOnUIThread()之类的

act.runOnUiThread(new Runnable() {...});

但是我认为这是不安全的,你需要采取预防措施,以确保在你打电话时你的活动仍在那里runOnUiThread

答案 1 :(得分:13)

Another better approach..

无需创建用于获取活动的构造函数。

只需将上下文强制转换为Activity类。

((Activity)context).runOnUiThread(new Runnable()
    {
        public void run()
        { 
             Toast.makeText(context, toast, Toast.LENGTH_SHORT).show();
        }
    });

答案 2 :(得分:3)

runOnUIThread()是属于Activity的方法。所以你不能从线程中调用它。

因此,而不是Context在其构造函数中使用Activity实例并使用它来调用它......类似于

activity.runOnUIThread();

答案 3 :(得分:1)

我发现了一种更整洁,更模块化的方法。为此,您需要定义Application Context。完成后,您可以从任何类库中调用RunOnUIThread,而无需引用Activity

从您的类库调用中的任何位置:

Handler handler = new Handler(Application.Context.MainLooper);
handler.Post(() => doStuff());

请记住,这是用C#编写的,因为我使用的是MonoDroid,但我相信它与Java非常相似。 有关如何创建ApplicationContext,请查看此thread

答案 4 :(得分:1)

您可以扩展您的课程以包含活动 喜欢这个

public class YourClass extends Activity {}

这将使'runOnUiThread'可用。

还记得导入活动

import android.app.Activity;

答案 5 :(得分:0)

我昨天在处理 Java Socket 时也遇到了这个问题。

1.将您的 Activity 传递给 FindLocation 构造函数

Activity activity;

public FindLocation(Activity activity) {
    this.activity = activity;
}

然后使用activity对象调用runOnUIThread()

this.activity.runOnUiThread(new Runnable() {
    ...
});

答案 6 :(得分:-1)

runOnUiThread 和 TimerTask 真的不是制作计时器等的最佳选择……我的两分钱避免了它们,因为还有其他更有效的方法可以帮助您实现相同的目的。 TimerTask 是最糟糕的类之一。非常简单的人喜欢使用它。很简单。