Android - 运行后台任务并处理活动重启

时间:2013-08-06 15:49:48

标签: android sdk android-asynctask intentservice

我正在尝试找出运行后台任务的最佳方法,同时显示微调器对话框并处理更改,例如设备的旋转或设备是否进入屏幕锁定然后解锁状态。

目前我的应用程序必须使用API​​ 8,最多16个,所以我知道getLastNonConfigurationInstance()现在是api 11(我认为)的冗余,我尝试了这个方法,以确保它不适用于API它没有的8个设备。然后我阅读了关于asynctaskloader的内容,但这不适用于API 8。

最后我读到了看起来可能是答案的intentservice,但我只需要知道如何通过重新启动活动的配置更改来处理这个问题。

我的后台任务是循环访问sqlite数据库并将行导出为CSV或从CSV导入。这些我已经通过AsyncTask完成了但是如果我旋转设备或锁定屏幕,它们会崩溃。

当Activity重新启动时,我怀疑如果我使用了一个intentservice,它就需要知道新的活动“reference”。使用AsyncTask我的理解是它附加到启动它的活动,因此当它重新创建时它会丢失该链接。

修改 **

由于我的原始问题,Marcin帮助解决了我遇到的一些问题。但是,看起来片段活动示例的链接与可下载的源代码不匹配,所以我的问题如下:

我正在尝试研究如何在listactivity中实现片段。我知道有一个Listfragment,但是如果我将listactivity改为this,我将无法从一个活动启动listfragment,因为我已经尝试过这个并且在这里阅读帖子除非listfragment在一个活动中,否则无法完成片段活动。

片段的原因是控制配置更改,listactivity用于显示文件和文件夹列表,然后用户可以选择要使用的文件,单击import然后我需要启动片段将有asynctask导入数据。

我还没有找到一个listactivity的例子,其中一个片段显示了这一点,我试图解决这个问题。

如果您需要我项目中的任何代码,请告诉我

由于

TimCS

1 个答案:

答案 0 :(得分:0)

看看setRerainInstance()。您可以将AsyncTask放入其中,之后不会重新创建 配置更改。您还可以阅读this帖子,这可能会有所帮助

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);
        }


    }
}

这就是我运行Fragment的方式:

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;