如何从服务或更好的方式调用AsyncTask进行后台更新

时间:2016-06-25 04:19:05

标签: java android android-asynctask

我正在开发应用程序,现在它从twitter中提取数据并按下按钮更新IU。我想自动化它,所以它会在后台每小时更新一次,并最终让它从后台发送通知。

我可以使用更新按钮调用AsyncTask,该按钮访问twitter并更新UI线程中的文本和图标。我也有一个服务,我可以打开和关闭一个复选框。我可以从服务中调用我的AsyncTask并将其设置为自动更新,还是我应该做的其他事情呢?

这是我对Main的简化代码:

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    lastUpdate = (TextView) findViewById(R.id.lastUpdate);

    //checkbox starts and stops service "TheService"
    CheckBox checkBox = (CheckBox) findViewById(R.id.check_box);

    checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if (isChecked) {
                startService(new Intent(MainActivity.this, TheService.class));
            }else{
                stopService(new Intent(MainActivity.this, TheService.class));
            }
        }
    });

}

//This function is called when button is clicked.
public void startTask(View view) {
    myAsyncTask mTask = new myAsyncTask();
    mTask.execute("abc", "10", "Hello world");
}

public class myAsyncTask extends AsyncTask<String, Integer, Void> {

    @Override
    protected Void doInBackground(String... arg) {
        try {
         //accesses twitter here
        } catch (TwitterException te) {
            System.exit(-1);
        }

        //New thread is created because this function can't update UI Thread.
        runOnUiThread(new Thread() {
            public void run() {
                TextView lastUpdate = (TextView) findViewById(R.id.lastUpdate);
                     //change text and icons on screen here
                lastUpdate.setText("Last updated: " + currentTime);
            }
        });
        return null;
    }
}
}

服务:

public class TheService extends Service {
@Override
public IBinder onBind(Intent intent) {
    return null;
}

@Override
public void onCreate() {
    Toast.makeText(this, "Service created!", Toast.LENGTH_LONG).show();
}

@Override
public void onDestroy() {
    Toast.makeText(this, "Service stopped", Toast.LENGTH_LONG).show();
}
}

1 个答案:

答案 0 :(得分:2)

最好使用线程内部服务代替您的服务器请求或重复或修复间隔请求并使用广播接收器或LocalBroadcastManager并从服务或线程发送该广播以更新您的活动中的ui不要忘记注册和取消注册reciver时你的应用程序是在resume(),暂停()或停止()状态,否则它泄漏。请记住,服务不是后台线程是简单的balnk ui你必须在服务器请求的服务内创建线程。你也可以通过搜索你的问题找到更好的SO线程和教程。希望你能理解。