1

私はビデオをダウンロードしているキューを実行していて、queが正しく機能するためにmandatorilyと呼ばれるAsyncTaskのpostExecuteを取得する必要があります..または、非同期タスクがプロセッサによって強制終了されたときに取得できるイベントが必要です。その他のバックグラウンドタスク」..メモリ不足..OnCancelledも呼び出されません...ヘルプはありますか?


@kdehairyインテントサービス??? 実際、UIを更新する必要があります。たとえば、asynctaskで開始されたビデオをダウンロードしていて、チャンクを追跡し、ユーザーがアクティビティを破棄した場合にカスタムprogressBarを更新し、作業が完了するまで非同期タスクをキャンセルしません。完了..私は非同期タスクを追跡します..何らかの理由で非同期タスクがバックグラウンドで停止した場合...それは再びタスクをキューに入れます..これはサービスによって実行されます...私が言っていることは私が私の非同期タスクを知らないことですはサービスまたはアプリからキューに入れられています...しかし、キューに入れられているasyncatsksを追跡し、スタックからプッシュしてポップします..asynctask postexecuteは、ビューを更新します... asynctaskがサービスから実行されている場合のように、postExecuteをチェックインしますUI画面が表示されます...そして、新しいインテントを呼び出すよりも、フラグシングルトップと新しいタスクを使用して、プログレスバーを更新できます。

例を教えてもらえますか...??? ありがとうKdehairy

4

2 に答える 2

2

プロセスのライフサイクルを処理することが重要な場合は、サービスを使用することをお勧めします。AsyncTaskはシステムコンポーネントではありません(サービスはあります)。

アップデート:

  1. IntentService独自の実装でを拡張します。
  2. UIを更新するには、boradcastを使用できます。次のように:

    1. UIを更新する必要があるときはいつでも、サービスでこれを作成してください。
      
      Intent intent = new Intent(ACTION_UPDATE_PROGRESS);
      intent.putExtra(EXTRA_POSITION, currentValue);
      LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
      
      ここでは、LocalBroadcastManagerこのブロードキャストをアプリケーションに対して非公開にしておきたいため、を使用してブロードキャストを送信しています。
    2. あなたの活動で:

      
      // this is the broadcast receiver object that will handle our UI updates.
      private BroadcastReceiver mReceiver = new BroadcastReceiver() {
          @Override
          public void onReceive(Context context, Intent intent) {
              int position = intent.getIntExtra(YourService.EXTRA_POSITION, 0);
              // do your UI updates here.
          }
      }
      
      @Override
      protected void onResume() {
          // register for the broadcast.
          LocalBroadcastManager.getInstance(this).registerReceiver(
              mReceiver,
              new IntentFilter(YourService.ACTION_UPDATE_PROGRESS));
          super.onResume();
      }
      @Override
      protected void onPause() {
          // unregister when activity is paused.
          LocalBroadcastManager.getInstance(PlayerActivity.this)
              .unregisterReceiver(mPlayerReceiver);
          super.onPause();
      }
      

不明な点がありましたらお知らせください。

于 2012-08-03T00:42:21.170 に答える
0

このようにしてみてください..またはこの例を見てください。それはあなたを助けます..必要な場所でonCancle()メソッドを呼び出します..以下の例のOnpause()に示すように、asyncTaskをキャンセルします

public class newA extends Activity implements OnClickListener {

private static final String TAG = "MyPost";

private boolean post_is_running = false;

private doSomethingDelayed doSth;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Button pushButton = (Button) findViewById(R.id.push_button);
    pushButton.setOnClickListener(this);

}

@Override
protected void onPause() {
    super.onPause();
    if (post_is_running) {
        Log.v(TAG, "Stopping Async Task onPause");
        doSth.cancel(true);
    }
}

@Override
protected void onResume() {
    super.onResume();
    if (post_is_running) {
        Log.v(TAG, "Starting Async Task onResume");
        doSth = (doSomethingDelayed) new doSomethingDelayed().execute();
        ((Button) findViewById(R.id.push_button)).setText("Resuming..");
    }
}

public void onClick(View v) {
    if (post_is_running == false) {
        post_is_running = true;
        Log.v(TAG, "Starting Async Task onClick");
        doSth = (doSomethingDelayed) new doSomethingDelayed().execute();
        ((Button) findViewById(R.id.push_button)).setText("Starting..");
    } else {
        Log.v(TAG, "Stopping Async Task onClick");
        post_is_running = false;
        doSth.cancel(true);
        ((Button) findViewById(R.id.push_button)).setText("Stopping..");
    }
}

private class doSomethingDelayed extends AsyncTask<Void, Integer, Void> {

    private int num_runs = 0;

    private JSONObject holder;

    @Override
    protected Void doInBackground(Void... gurk) {

        while (!this.isCancelled()) {
            Log.v(TAG, "going into postData");

            long ms_before = SystemClock.uptimeMillis();
            Log.v(TAG, "Time Now is " + ms_before);

            try {
                Thread.sleep(5000);
                postData();

            } catch (InterruptedException e) {

                e.printStackTrace();
            }

            long ms_after = SystemClock.uptimeMillis();

            long time_passed = ms_after - ms_before;

            Log.v(TAG, "coming out of postData");
            Log.i(TAG, "RTT: " + time_passed + " ms");

            num_runs++;

            if (!this.isCancelled()) {
                publishProgress(num_runs, (int) time_passed);
            }

        }
        return null;
    }

    @Override
    protected void onCancelled() {
        Context context = getApplicationContext();
        CharSequence text = "request is send every 5 sec.";
        int duration = Toast.LENGTH_LONG;

        Toast.makeText(context, text, duration).show();

        ((Button) findViewById(R.id.push_button))
                .setText("Stopped. Tap to Start for sending new request!");
    }

    @Override
    protected void onProgressUpdate(Integer... num_runs) {
        Context context = getApplicationContext();
        CharSequence text = "Looped with time interval in every 5 sec "
                + num_runs[0].toString() + " Times";
        int duration = Toast.LENGTH_SHORT;

        Toast.makeText(context,
                text + "\nRTT: " + num_runs[1].toString() + " ms", duration)
                .show();

        ((Button) findViewById(R.id.push_button)).setText(text
                + "\nTap to Stop process");

    }

    public void postData() {

        // Create a new HttpClient and Post Header
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost("http://192.168.1.1/listen");

        String resp = null;
        long time_passed = 0;

        // Sending details in Json Format

        holder = new JSONObject();

        try {
            holder.put("UserId", "1");
            holder.put("TimeStamp", "12345");
            System.out.println("----holder--" + holder);

        } catch (JSONException e1) {
            e1.printStackTrace();
        }

        try {
            StringEntity se = new StringEntity(holder.toString());
            se.setContentType(new BasicHeader(HTTP.CONTENT_TYPE,
                    "application/json"));
            httppost.setEntity(se);
            HttpResponse response = httpclient.execute(httppost);
            resp = response.toString();
            String t = EntityUtils.toString(response.getEntity());

        } catch (ClientProtocolException e) {
            Log.e(TAG, e.toString());
        } catch (IOException e) {
            Log.e(TAG, e.toString());
        } catch (RuntimeException e) {
            e.printStackTrace();
        }

        Log.i(TAG, "RTT inside post-data: " + time_passed);

        Log.i(TAG, resp.toString());
    }
}
}
于 2012-09-28T07:46:08.890 に答える