Мой метод обратного вызова никогда не вызывается с использованием интерфейса

Я пытаюсь реализовать callback метод, который будет вызываться всякий раз, когда Thread Это сделано Это работа. Я использую interface подход, а не Handler подход.

У меня есть основной UIThread какой onCreate(Bundle) метод и Thread я звоню изнутри onCreate(Bundle) метод.

(Только соответствующий код размещен).

MainActivity.java:

public class MainActivity extends AppCompatActivity implements GetDataFromTheWebThreadCallback
{
    public static GetDataFromTheWebThread getDataFromTheWebThread;
    private GetDataFromTheWebEventNotifier eventNotifier;
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        this.eventNotifier = new GetDataFromTheWebEventNotifier(MainActivity.this);

        // The thread that will search the web for data
        this.getDataFromTheWebThread = new GetDataFromTheWebThread();
        getDataFromTheWebThread.start();
     }

        @Override
        public void finishParsing() // The callback method that never called
        {
            Toast.makeText(MainActivity.this,"Callback Method Called",Toast.LENGTH_LONG).show();
            Log.d("Callback:", "Callback Method Called");
        }
}

GetDataFromTheWebEventNotifier.java:

public class GetDataFromTheWebEventNotifier
{
    private GetDataFromTheWebThreadCallback callbackInterface;

    public GetDataFromTheWebEventNotifier(GetDataFromTheWebThreadCallback callbackInterface)
    {
        this.callbackInterface = callbackInterface;
    }

    public void onEvent()
    {
            this.callbackInterface.finishParsing();
    }
}

GetDataFromTheWebThreadCallback.java:

public interface GetDataFromTheWebThreadCallback
{
    void finishParsing(); // The method i wish to invoke when certain event will happen
}

GetDataFromTheWebThread.java:

public class GetDataFromTheWebThread extends Thread
{
    public static boolean isFinished = false; // False - the thread is still running. True - the thread is dead

    @Override
    public void run()
    {
        GetDataFromTheWebThread.isFinished = false;
        try
        {
            // Some internet computations...
            Thread.sleep(100);
        }
        catch (InterruptedException e)
        {
            e.printStackTrace();
        }
        GetDataFromTheWebThread.isFinished = true;
    }
}

Так что не так с моим callback?

3 ответа

Решение

Что касается вашего ThreadClass, есть конструктор с обратным вызовом:

public class GetDataFromTheWebThread extends Thread {
    public static boolean isFinished = false; // False - the thread is still running. True - the thread is dead
    private GetDataFromTheWebThreadCallback mCallback;

    public GetDataFromTheWebThread(GetDataFromTheWebThreadCallback c) {
      mCallback = c;
    }

    @Override
    public void run() {
      GetDataFromTheWebThread.isFinished = false;
      try {
        // Some internet computations...
        Thread.sleep(100);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
      GetDataFromTheWebThread.isFinished = true;
      if (mCallback !- null) {
        mCallback.finishParsing();
      }
    }
}

Что касается вашей активности, просто передайте обратный вызов при создании вашей темы:

this.getDataFromTheWebThread = new GetDataFromTheWebThread(this);

Так же как:

    @Override
    public void finishParsing()  {
      // You know that this function is called from a background Thread.
      // Therefore from here, run what you have to do on the UI Thread
      runOnUiThread(new Runnable() {
        @Override
        public void run() {
          Toast.makeText(MainActivity.this,"Callback Method Called",Toast.LENGTH_LONG).show();
          Log.d("Callback:", "Callback Method Called");
        }});

    }

Ты никогда не звонишь onEvent(), Ваш уведомитель должен наблюдать за isFinished переменная или что-то?

На самом деле вы не вызывали onEvent(). И проверьте AsyncTask.

Другие вопросы по тегам