繁体   English   中英

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

[英]Android - running background task and handle activity restart

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

目前,我的应用程序必须可以使用API​​ 8或更高版本16,因此我知道getLastNonConfigurationInstance()现在对api 11来说是多余的(我认为),并且我尝试使用此方法来确保它无法在API 8设备上正常工作。没有。 然后,我阅读了有关asynctaskloader的信息,但这不适用于API 8。

最后,我阅读了有关intentservice的信息,这可能是答案,但我只需要知道如何在重新启动活动的地方通过配置更改来处理此问题。

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

随着活动的重新启动,我怀疑如果我使用了一个intentservice,那么就需要知道新活动的“引用”。 使用AsyncTask,我的理解是它附加到启动它的活动上,因此,在重新创建它时,它将失去该链接。

编辑 **

自从我最初提出问题以来,Marcin就解决了我遇到的一些问题。 但是,似乎到一个片段活动示例的链接与可下载的源代码不匹配,所以我的问题现在如下:

我正在尝试找出如何在我的listactivity中实现一个片段。 我知道有一个Listfragment,但是如果我将listactivity更改为此,我将无法从活动中启动listfragment,因为我已经尝试过了,并且除非此处的listfragment位于活动或内部,否则无法阅读此处的帖子。片段活动。

我创建片段的原因是控制配置更改,并且listactivity用于显示文件和文件夹的列表,然后用户可以选择他们要使用的文件,单击“导入”,然后我需要启动包含以下内容的片段: asynctask导入数据。

我还没有找到一个带有列表片段的listactivity例子,我正在设法弄清楚这一点。

请告知我您是否需要我的项目中的任何代码

谢谢

TimCS

看一下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);
        }


    }
}

这是我运行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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM