Android runOnUIThread для интеграции Chartboost SDK для AGK AppGameKit NDK

Мы используем App Game Kit для одного из наших приложений и пытаемся удалить AdMob, чтобы использовать Chartboost. AGK использует интерпретатор своего языка, который проходит через NDK на java. У них есть класс AGKHelper, который является точкой входа для команд, которые в настоящее время вызывают Facebook, AdMob, диалоговое окно с предупреждением и некоторые другие действия. Каждый из методов в AGKHelper запускает события через Runnable классы. Вот пример их процедуры создания предупреждающего диалога:

public class AGKHelper {
    //just a sample of what's in there many other methods exist
    public static void ShowMessage( Activity act, String msg )
    {
        RunnableMessage run = new RunnableMessage();
        run.act = act;
        run.msg = msg;
        act.runOnUiThread( run );
    }

}

Теперь о классе RunnableMessage, который создает диалоговое окно предупреждения.

class RunnableMessage implements Runnable
{
    public Activity act;
    public String msg;

    public void run() {
            AlertDialog alertDialog;
            alertDialog = new AlertDialog.Builder(act).create();
            alertDialog.setTitle("Message");
            alertDialog.setMessage(msg);
            alertDialog.setButton( DialogInterface.BUTTON_POSITIVE, "OK", new DialogInterface.OnClickListener(){public void onClick(DialogInterface dialog, int which) {}});
            alertDialog.show();
            }
 }

Также существует CreateAd() метод, который создает объявления для AdMob с использованием runOnUiThread(), но с WindowManager для показа рекламы. Насколько мы можем судить, мы ДОЛЖНЫ использовать Runnable, чтобы активировать Chartboost. Мы следовали интеграции SDK Chartboost и застряли при создании нашего Runnable для него. Все Runnables, которые использует AGKHelper, также ссылаются на NativeActivity, мы полагаем, передав его в качестве параметра методу, например ShowMessage(), а затем выполняя с ним что-то в классе Runnable для каждого из этих методов. Такие как

AlertDialog.Builder(act) //for the message
ad = new AdView(act, AdSize.BANNER, pubID); //for AdMob - RunnableAd
feed.dialog(act, "feed", parameters,new DialogListener() {} // for RunnableFacebook

К сожалению, не существует способа передать NativeActivity исполняемому объекту Chartboost. У нас очень мало опыта работы с java, поэтому мы учимся на ходу и чувствуем, что добиваемся прогресса, но тогда ничего не происходит.

Есть ли у кого-нибудь полный пример класса Runnable, который показывает Chartboost? Мы были бы очень признательны за помощь. Я бы хотел рассказать больше о классе AGKHelper, например, о полном методе RunnableAd(), но он длинный и заполнен настройками WindowsManager. RunnableMessage - самый короткий пример, который я могу привести. Спасибо.


person naphier    schedule 02.04.2014    source источник


Ответы (1)


Мы смогли запустить это с Intent и startActivity().

AGKHelper класс, который является точкой входа для всех команд, содержит:

public static void CreateAd(Activity act, String publisherID, int horz, int vert, int offsetX, int offsetY)
{       
    Looper.prepare();

    Intent myIntent = new Intent(act, ChartboostActivity.class);
    act.startActivity(myIntent);
}

ChartboostActivity класс:

public class ChartboostActivity extends Activity {
    private Chartboost cb;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.chartboostmain);
        //requestWindowFeature(Window.FEATURE_NO_TITLE);

        // Configure Chartboost
        this.cb = Chartboost.sharedChartboost();

        String appId = "XXXXXXXXXXXXXX";
        String appSignature = "XXXXXXXXXXXXXXX";
        this.cb.onCreate(this, appId, appSignature, null);
        //this.cb.setImpressionsUseActivities(true);
        CBPreferences.getInstance().setImpressionsUseActivities(true);
    }

    @Override
    public void onStart() {
         super.onStart();
         this.cb.onStart(this);
         // Notify the beginning of a user session. Must not be dependent on user actions or any prior network requests.
         this.cb.startSession();
         // Show an interstitial
         //this.cb.showInterstitial(); 
         this.cb.showMoreApps();
         finish();
    }

    @Override
    protected void onStop() {
        //finish();
        super.onStop();

        this.cb.onStop(this);
    }

    @Override
    protected void onDestroy() {        
        //finish();
        super.onDestroy();

        this.cb.onDestroy(this);
    }

    @Override
    public void onBackPressed() {
         // If an interstitial is on screen, close it. Otherwise continue as normal.
         if (this.cb.onBackPressed())
         {
             finish();
             return;
         }
         else    
             super.onBackPressed();
    }
}

Хотя это, кажется, работает нормально, нам показалось странным, что мы не можем использовать finish() для закрытия цикла в onDestroy() или onStop(). В идеале мы хотели бы сделать все это в классе Runnable, чтобы иметь доступ к активности и вызывать другие методы. Если у кого-то есть пример этого, мы будем очень признательны. Но это решение, похоже, работает!

person naphier    schedule 05.04.2014