【问题标题】:Starting AsyncTask from different class file (via onReceive)从不同的类文件启动 AsyncTask(通过 onReceive)
【发布时间】:2012-12-17 00:30:26
【问题描述】:

无论我搜索多少,都无法克服。

我有 AlarmManager,我想在每 X 秒后启动 AsyncTask。

我确实有另一个文件,类 (Alarm.class) 我有 onReceive。无论我放入其中,都会完美激活。

现在我有问题。我的主线程/类(Onime)中有 AsyncTask。它执行许多任务,包括下载一些内容。

现在的问题是,如何从另一个类启动 AsyncTask。可悲的是静态不起作用,因为 asyc 包含一些不允许静态的东西。是否可以通过某种服务实现

public class Alarm extends BroadcastReceiver 
{    
     @Override
     public void onReceive(Context context, Intent intent) 
     {   
         // Put here YOUR code.
         Log.d("alarminfo", "Alarm works!"); 


     }

 public void SetAlarm(Context context)
 {
     AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
     Intent i = new Intent(context, Alarm.class);
     PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
     Calendar time = Calendar.getInstance();
     time.setTimeInMillis(System.currentTimeMillis());
     time.add(Calendar.SECOND, 30);
     am.setRepeating(AlarmManager.RTC_WAKEUP, time.getTimeInMillis(), 1000*60*1, pi); // Millisec * Second * Minute
     Log.d("alarminfo", "Set alarm!"); 
 }

 public void CancelAlarm(Context context)
 {
     Log.d("alarminfo", "End alarm!"); 
     Intent intent = new Intent(context, Alarm.class);
     PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0);
     AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
     alarmManager.cancel(sender);
 }
}

那就是警报类。

这里是异步(它在 Onime.class 中(不同的文件):

class animeUpdator extends AsyncTask<ArrayList<Anime>, Integer, String> {

        class Connection implements Runnable {

            public void run () {
                    try {
                        URL url = new URL("http://xxx.com");
                        URLConnection urlConnection = url.openConnection();
                        BufferedReader bufferedReader = 
                            new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
                        String line;
                        count = 1;
                        anime_list.clear();
                        while ((line = bufferedReader.readLine()) != null) {
                            parsingAnime(line);
                            count += 1;
                        }

                        bufferedReader.close();

                        MessageToMainThread(UPDATE_MAIN_GUI);

                    } catch(Exception e) {
                        Log.d("readInfo", e.toString()); 
                    }
                }

        }    

【问题讨论】:

    标签: android service android-asynctask


    【解决方案1】:

    如果你需要创建一个内部类的实例,你从它的外部类开始:

    Onime.animeUpdator.class.getConstructors()[0].newInstance(new Onime());
    

    注意,Java 类名应该以大写开头。前任。动漫更新器;

    更多信息,请参阅postthis
    或者正如评论指出的那样:

    public class animeUpdator extends AsyncTask<ArrayList<Anime>, Integer, String> {
       public animeUpdator(){
              ...
       }
    

    }

    【讨论】:

    • 事情是...animeUpdator在“Onime”类中,有什么不同的文件:/...(mainActivity)
    • @newest 更新:无法访问 Onime 类型的封闭实例。必须使用 Onime 类型的封闭实例来限定分配(例如,x.new A() 其中 x 是 Onime 的实例。 - 这也是我之前遇到的问题。
    • 至少它不会显示编码错误,但会抛出异常:12-17 03:18:18.829: E/AndroidRuntime(647): java.lang.RuntimeException: Unable to start receiver xx. xx.xx.Alarm:java.lang.ArrayIndexOutOfBoundsException:长度=0; index=0 - 我认为它可能已经在 AsyncTask 问题中了?
    • 尝试添加构造函数。正如我编辑的那样。从另一个类创建 Asynctask 的实例并不是一个好主意。
    • 谢谢,它有点工作:)。我确实得到了空指针,但我认为原因可能是这一次真的是别的东西。无论如何,我会自己研究一下。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多