我可以在不影响 UI的情况下休眠或停止 AsycTask 的执行吗?除了创建一个新线程来实现这一点之外,还有其他方法吗(我确信这不会影响 UI)?
解释:
public class MyAsync extends AsyncTask<....>{
@Override
..doInbackground(){
//do something
for(....){
//sleep this Asynctask
//I want to delay my for loop
}
//do something
}
}
Run Code Online (Sandbox Code Playgroud)
创建一个新线程不是我想要的,如下所示:
//inside doInBackground()
new Thread(new Runnable(){
@Override
public run(){
for(..){
Thread.sleep(1000);//sleeping for 1 second
}
}
});
//other parts
Run Code Online (Sandbox Code Playgroud)
PS我在服务中使用AsyncTask每 N 秒在后台运行一次。
我看到很多这些问题的遗嘱(这里,这里,这里和这里),但我没有得到解决我的问题.
这是我的应用程序的想法
从URL中获取内容并在每次单击按钮时使用textview显示它.
(URL内容将为每次刷新随机生成不同的文本)
这是我的应用程序的旧代码完美地工作但StackOverflow人员建议我使用AsyncTask
我在doInBackground()方法中指定了获取URL内容操作,并在onCreate的 Button Click Event中调用了new myAsyncTask.execute().
它只适用于第一次点击,然后我的应用程序崩溃了.它说AsyncTask应该只调用一次.但我希望我的TextView在每个按钮点击事件上更新.
那么,我现在应该怎么做
我是否要取消之前的AsyncTask并调用新的(或)我想为AsyncTask初始化新对象并再次调用它(这是最糟糕的方法)
如何使用AsyncTask或任何Alternate在我的应用程序中实现我的想法?
这是我的代码:
public class MainActivity extends AppCompatActivity {
TextView resultView;String TAG="MainActivity kbt";
SmoothProgressBar mProgressBar;
Context context;
MyAsyncTask myAsyncTask;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// StrictMode.enableDefaults(); //Used to executes URL connection on MainThread without getting Exception
setContentView(R.layout.activity_main); …Run Code Online (Sandbox Code Playgroud) 我的 AsyncTask、RecyclerAdapter 和 RecycleViewHolder 类在不扩展片段的活动中工作得很好。但是每当我尝试在片段类中执行 AsyncTask 时,我得到的只是一个 IDE 红旗(无法访问的语句)。有人帮助我如何在片段中执行 AsyncTask(我使用的是 Android studio 1.5.1。我搜索了答案但失败了,但得到了一个令我满意的答案。下面是我的代码。-谢谢。
public class TabFragmentNews extends Fragment {
private static final String ARG_EXAMPLE = "this_is_a_constant";
private String example_data;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_news, container, false);
//Executing The Async Task Class Here
newsupdate();
}
//Method For Executing The Async Task
public void newsupdate() {
BackgroundTask backgroundTask = new BackgroundTask(getActivity());
backgroundTask.execute();
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
example_data = getArguments().getString(ARG_EXAMPLE);
Log.i("Fragment …Run Code Online (Sandbox Code Playgroud) java android android-asynctask android-fragments android-recyclerview
我有2个活动,i)MainActivity ii)FavoriteActivity和非活动类RadioService.两个Activity都有一个相同的方法 - notifyShowBar(),它显示了一个在showbar.xml@layout中定义的文本栏.
MainActivity.java
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
@Override
protected void onResume() {
super.onResume();
notifyShowBar();
}
public void notifyShowBar() {
....
textView.setText(revs.getMeta());
....
}
.....
Run Code Online (Sandbox Code Playgroud)
FavoriteActivity.java
public class FavoriteActivity extends AppCompatActivity implements View.OnClickListener {
@Override
protected void onResume() {
super.onResume();
notifyShowBar();
}
public void notifyShowBar() {
....
textView.setText(revs.getMeta());
....
}
.....
Run Code Online (Sandbox Code Playgroud)
现在,当一个活动调用RadioService时,它会创建一个timertask,然后定期从服务器获取信息,并在父活动中显示bar.因此栏显示每15秒更新一次信息.
private class ProgressTask extends AsyncTask<String, Void, Boolean> {
@Override
protected void onPostExecute(final Boolean …Run Code Online (Sandbox Code Playgroud) public class PhrasesActivity extends AppCompatActivity {
MediaPlayer mediaPlayer;
private MediaPlayer.OnCompletionListener onCompletionListener = new MediaPlayer.OnCompletionListener(){
@Override
public void onCompletion(MediaPlayer mediaPlayer) {
releaseMediaPlayer();
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.word_list);
final ArrayList<Word> words = new ArrayList<Word>();
#some Word elements added
WordAdapter wordAdapter = new WordAdapter(this, words, R.color.category_phrases);
ListView listView = (ListView)findViewById(R.id.numberlist);
listView.setAdapter(wordAdapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Toast.makeText(PhrasesActivity.this, "Demo", Toast.LENGTH_SHORT).show();
Word word = words.get(i);
releaseMediaPlayer();
mediaPlayer = MediaPlayer.create(PhrasesActivity.this, word.getAudioResourceID());
mediaPlayer.start(); …Run Code Online (Sandbox Code Playgroud) 我试图在我的本地数据库中发送和验证我的登录凭据,因此我使用了json,以便将条目转换为json对象并使用json解析器类对其进行解析.
这是我的代码:
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
public class LoginActivity extends AppCompatActivity {
EditText editEmail, editPassword, editUserName, editName, editBikeName, editBikeNo;
Button btnSignIn,btnRegister;
TextView regText, bikeText, pedText;
String URL= "http://192.168.225.22/android/index.php";
JSONParser jsonParser=new JSONParser();
int i=0,j=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
editEmail=(EditText)findViewById(R.id.editEmail);
editUserName=(EditText)findViewById(R.id.editUserName);
editPassword=(EditText)findViewById(R.id.editPassword);
editName=(EditText)findViewById(R.id.editName);
editBikeName=(EditText)findViewById(R.id.editBikeName);
editBikeNo=(EditText)findViewById(R.id.editBikeNo);
regText=(TextView)findViewById(R.id.regText);
btnSignIn=(Button)findViewById(R.id.btnSignIn);
btnRegister=(Button)findViewById(R.id.btnRegister); …Run Code Online (Sandbox Code Playgroud) 我在我的Android库项目中使用AsyncTask来避免networkonmainthreadexception,现在我想做的是将值返回到我的变量并在执行下一行代码之前等待它.我使用CountDownLatch来做到这一点.
我执行我的请求并调用我的AsyncTask的方式如下所示.所以我使用CountDownLatch等待响应,然后返回我想要返回的值.
public MyObject getMyObject(){
final String url = "http://[myip]:8080/retrieve";
try{
Response response = executeRequest(url);
final MyObject myObject = om.readValue(response.body().string(),
new TypeReference<MyObject>() {
});
return myObject;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
private Response executeRequest(String url){
try {
//Simplified please just ignore this..
GenericAsyncParams genericAsyncParams = createParams(......);
final CountDownLatch countDownLatch = new CountDownLatch(1);
ResponseListener responseListener = new ResponseListener(countDownLatch);
MyAsyncTask myAsyncTask = new AsyncTask(responseListener);
myAsyncTask.execute(genericAsyncParams);
countDownLatch.await();
//get the response from the listener class.
Response response = responseListener.getResponse(); …Run Code Online (Sandbox Code Playgroud) 我正在开发一个画廊应用程序,该应用程序显示手机或笔式驱动器中的所有图像。我成功地列出了所有图像并将其显示在应用程序中。但我认为它很慢。我使用的Depth First Search技术内的AsyncTask。那么有没有其他方法可以在里面使用AsyncTask,速度要快得多。这里的 root 是一个由树 URI 组成的 DocumentFile。
这是我使用过的代码。
public class ImageBackgroundTask extends AsyncTask<Object, Object, ArrayList<DocumentFile>> {
DocumentFile root;
ArrayList<DocumentFile> result;
ProgressDialog pg;
Context context;
private AsyncTaskCompleteListener<ArrayList<DocumentFile> > callback;
ImageBackgroundTask(DocumentFile root, Context context, AsyncTaskCompleteListener<ArrayList<DocumentFile>> cb){
this.context=context;
this.root=root;
this.callback = cb;
}
@Override
protected ArrayList<DocumentFile> doInBackground(Object... voids) {
Queue<DocumentFile> stack=new ArrayDeque<>();
ArrayList<DocumentFile> list=new ArrayList<>();
for(DocumentFile f:root.listFiles()){
stack.add(f);
}
while(!stack.isEmpty()){
DocumentFile child=stack.remove();
if(child.isDirectory()){
for(DocumentFile file:child.listFiles()){
stack.add(file);
}
}
else if(child.isFile()){
String name=child.getName();
if(name.endsWith(".jpg")
|| name.endsWith(".png")
|| …Run Code Online (Sandbox Code Playgroud) 因此,在 a 中IntentService,应用程序可能处于活动状态或非活动状态,onHandleIntent被调用,我将其放置在代码下方。这是我将数据存储到领域的地方。
Realm realm = null;
try {
realm = Realm.getDefaultInstance();
realm.executeTransactionAsync(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
for (AppItem item : items) {
AppItem item2 = realm.createObject(AppItem.class, UUID.randomUUID().toString());
item2.mName = item.mName;
item2.mCount = item.mCount;
item2.mUsageTime = item.mUsageTime;
}
}
});
} finally {
if (realm != null) {
realm.close();
}
}
Run Code Online (Sandbox Code Playgroud)
然后我尝试在onPostExecutein 中访问它AsyncTask,在 中doInBackground,我正在获取RealmResults<AppItem>,然后将其存储到List <AppItem>并将其发送到onPostExecute放置此代码的位置。appItems这里是 ReamObject
Realm backgroundRealm …Run Code Online (Sandbox Code Playgroud) 一旦doInBackground()完成后我想从我的主要活动中启用几个按钮!有人可以让我知道怎么做吗?
因为它不是一个班级,所以我不能用它findViewByID()来让AsyncTask班级上的按钮可见activity!:/