2013-08-06 37 views
0

我正试图找出最佳方法来运行后台任务,同时显示微调对话框并处理更改(如设备旋转或设备进入屏幕锁定然后解锁状态。Android - 正在运行后台任务并处理活动重启

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

最后,我读了关于intentservice出现可能是答案,但我只需要知道如何处理此配置更改的地方重新开始活动。

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

由于活动重新启动,我怀疑如果我使用intentservice,它需要知道新的活动“参考”可以这么说。对于一个AsyncTask,我的理解是它附加到启动它的活动中,所以当它重新创建时,它会丢失该链接。

编辑 **

由于我原来的问题马尔辛 - 已经帮助了一些的我有问题。然而,似乎链接到活动的一个例子,一个片段不匹配的源代码可以下载,因此我的问题是现在如下:

我试图找出如何实现我的列表活动中的片段。我知道有一个Listfragment,但如果我改变我的列表活动为此,我将无法从一个活动启动列表片段,因为我已经尝试过这一点,并阅读帖子,除非listfragment在一个活动中,否则不能完成。片段活动。

我的一个片段的原因是为了控制配置更改和listactivity用来显示文件和文件夹列表,然后用户可以选择他们要使用的文件,单击导入,然后我要开始的片段这将有asynctask导入数据。

我还没有找到一个listactivity的例子,显示这个片段,我试图找出这一点。

请KET我知道,如果你从我的项目需要的任何代码

感谢

TimCS

+0

你想对你的活动设备旋转时重新启动?如果我没有错,你可以选择不重新启动它。 –

+0

如果这是可能的,是的,当前正常情况下,当屏幕旋转或设备进入“睡眠”时,它会重新启动,并且当解锁屏幕时,这有时会导致它崩溃,所以我只假设活动(实际上是ListActivity)也必须重新启动。如果你可以让我知道如何阻止它重新启动,这将是伟大的! – TimCS

回答

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


    } 
} 

我这是怎么运行的片段:从MainActivity

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

这里是进口:

import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentActivity; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentTransaction; 
+0

谢谢Macrin我会看看这个。我认为setRetainInstance需要与Fragment方法或getLastNonConfigurationInstance()一起使用 - 是的,它与片段一起使用,这是我目前无法理解的东西。不过我会试着把它推入我的大脑。我也通过t片段不在API 8 – TimCS

+0

@TimCS中,是的,它与碎片一起使用。但支持库在API 8之前是可用的。 –

+0

@Macrin会使Intentservice更好,或者这会更复杂吗?片段在asyncTasks上看起来很复杂,但看起来像是我的时间来咬他们的牙齿。 – TimCS