0

スピナーダイアログボックスを表示しながらバックグラウンドタスクを実行し、デバイスの回転などの変更を処理したり、デバイスが画面ロックになってからロック解除状態になったりする場合に最適な方法を見つけようとしています。

現在、私のアプリは API 8 から 16 までで動作する必要があるため、getLastNonConfigurationInstance() が api 11 (だと思います) から冗長になっていることがわかり、API 8 デバイスでは動作しないことを確認するためにこのメソッドを試しました。しませんでした。次に、asynctaskloader について読みましたが、これは API 8 では利用できません。

最後に、答えになる可能性があるインテントサービスについて読みましたが、アクティビティが再開される構成変更でこれを処理する方法を知る必要があります。

私のバックグラウンド タスクは、sqlite データベースをループして行を CSV としてエクスポートするか、CSV からインポートすることです。これらは AsyncTask で既に行っていますが、デバイスを回転させたり、画面をロックしたりするとクラッシュします。

アクティビティが再開されると、インテントサービスを使用した場合、いわば新しいアクティビティの「参照」を知る必要があるのではないかと思います。AsyncTask を使用すると、それはそれを開始したアクティビティに関連付けられているため、再作成するとそのリンクが失われるということが私の理解です。

編集**

私の最初の質問以来、Marcin は私が抱えていたいくつかの問題を解決してくれました。ただし、フラグメントへのアクティビティの例へのリンクは、ダウンロードできるソース コードと一致しないため、私の質問は次のとおりです。

リストアクティビティ内にフラグメントを実装する方法を考え出そうとしています。リストフラグメントがあることは知っていますが、リストアクティビティをこれに変更すると、アクティビティからリストフラグメントを開始できなくなります。これはすでに試しており、ここで投稿を読んでいるため、リストフラグメントがアクティビティ内にない限り、またはこれを行うことはできません。フラグメント活動。

フラグメントの私の理由は、構成の変更を制御することであり、リストアクティビティはファイルとフォルダーのリストを表示するために使用され、ユーザーは使用するファイルを選択し、[インポート] をクリックして、フラグメントを開始する必要があります。 asynctask を使用してデータをインポートします。

これを示すフラグメントを含むリストアクティビティの例をまだ見つけていません。これを理解しようとしています。

私のプロジェクトのコードが必要な場合はお知らせください

ありがとう

ティムCS

4

1 に答える 1

0

setRerainInstance()を見てください。その中に AsyncTask を入れることができ、構成の変更後に再作成されることはありません。この投稿も読むことができます。役立つ場合があります

package com.example.we.helpers;

import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.Fragment;

import com.example.we.MainActivity;

public class ImageFragment extends Fragment{
    public static final String URL = "http://link.com";
    private ImageTask task;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setRetainInstance(true);
    }

    public void startDownloading(){
        task = new ImageTask();
        task.execute();
    }

    public class ImageTask extends AsyncTask<Void, Void, Bitmap>{

        @Override
        protected Bitmap doInBackground(Void... arg0) {
            Bitmap bmp =null;
            try{
                URL ulr = new URL(URL);
                HttpURLConnection con = (HttpURLConnection)ulr.openConnection();
                InputStream is = con.getInputStream();
                bmp = BitmapFactory.decodeStream(is);
            }catch(Exception e){
                    e.printStackTrace();
            }
            return bmp;
        }

        @Override
        protected void onPostExecute(Bitmap result) {
            if(getActivity() instanceof MainActivity == false){
                return;
            }

            MainActivity activity = (MainActivity) getActivity();
            activity.onImageLoaded(result);
        }


    }
}

これは私がフラグメントを実行する方法です:

ImageFragment fragment = new ImageFragment();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.add(fragment, LOADER);
transaction.commit();
fragment.startDownloading();

MainActivity からのインポートは次のとおりです。

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
于 2013-08-06T16:25:35.260 に答える