1

iOS アプリケーション開発から android に移行したため、以前使用していた機能を見つけるのにいくつかの問題に直面しています。

[self performSelectorOnMainThread:@selector() withObject: waitUntilDone:];このクラスがActivityクラスから継承されていないことを知って、任意のクラスのインスタンスからアクセスできるandroidのような関数はありますか?

これを行う関数があることがわかりましたが、runOnUiThreadアクティビティ以外のオブジェクトから呼び出す必要があるため使用できませんでした。現在表示されているアクティビティにアクセスする方法はありますか、それとも別のソリューションを使用する必要がありますか? .

4

2 に答える 2

5

アクティビティ オブジェクトがない場合は、ハンドラーを使用できます。クラス「ハンドラー」は、UI を更新できます。ハンドルは、メッセージを受信するためのメソッドと実行可能なメソッドを提供します。ハンドラーを使用するには、ハンドラーをサブクラス化し、handleMessage() をオーバーライドしてメッセージを処理する必要があります。ランナブルを処理するには、メソッド post(); を使用できます。アクティビティに必要なハンドラーのインスタンスは 1 つだけです。

スレッドは、メソッド sendMessage(Message msg) または sendEmptyMessage を介してメッセージを投稿できます。

サンプル例

  1. ハンドラーの例

この例では、「Handler」クラスを使用して、バックグラウンド スレッドで ProgressBar を更新します。

アクティビティ「ProgressTestActivity」で新しい Android プロジェクト「de.vogella.android.handler」を作成します。次のレイアウト「main.xml」を作成します。このレイアウトには ProgressBar が含まれ、スタイルを介してその外観を設定します。

アクティビティを次のように変更します。

package de.vogella.android.handler;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.ProgressBar;

public class ProgressTestActivity extends Activity {
private Handler handler;
private ProgressBar progress;


/** Called when the activity is first created. */

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    progress = (ProgressBar) findViewById(R.id.progressBar1);
    handler = new Handler();
}

public void startProgress(View view) {
    // Do something long
    Runnable runnable = new Runnable() {
        @Override
        public void run() {
            for (int i = 0; i <= 10; i++) {
                final int value = i;
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        progress.setProgress(value);
                    }
                });
            }
        }
    };
    new Thread(runnable).start();
}
}

アプリケーションを実行します。ボタンを押すと、ProgressBar がバックグラウンド スレッドから更新されます。

サンプルはhttp://www.vogella.de/articles/AndroidPerformance/article.html#concurrency_handlerからのものです

于 2011-11-22T13:48:55.833 に答える
1

現在のorActivityを取得できるクラス内のパブリック メソッドを公開する限り、どのクラスでも にアクセスできます。例えば:ActivityContext

    public class SomeClass {

    public void launchActivity(Context context) {
       context.startActivity(new Intent(context, SomeOtherActivity.class));
    }

    public void showToast(Context context) {
       Toast.makeText(context, "check me out!", Toast.LENGHT_LONG).show();
    }

 }

それに魔法はありません。Java は、Objective-C と同様にオブジェクト指向言語です。問題は、プレーンな古い Java オブジェクトに現在の を「与える」ために、Activityその 内からそれを渡す必要があるということActivityです。

于 2011-11-22T13:54:09.420 に答える