标签: android-asynctask

暂停或睡眠 AsyncTask 而不影响 UI

我可以在不影响 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 秒在后台运行一次。

java multithreading android android-asynctask

0
推荐指数
1
解决办法
3201
查看次数

在按钮单击中执行AsyncTask而不会出现崩溃或异常

我看到很多这些问题的遗嘱(这里,这里,这里这里),但我没有得到解决我的问题.

这是我的应用程序的想法

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)

android android-asynctask

0
推荐指数
1
解决办法
5354
查看次数

无法在扩展片段的类中执行 AsyncTask

我的 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

0
推荐指数
1
解决办法
620
查看次数

Android活动:定期更新来自同一数据源的两个活动文本

我有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)

android timertask android-asynctask android-activity

0
推荐指数
1
解决办法
136
查看次数

onPause() 和 onStop() 不起作用

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)

android android-asynctask android-activity

0
推荐指数
1
解决办法
2713
查看次数

LoginActivity.AttemptLogin不是抽象的,并且不会覆盖AsyncTask中的抽象方法doInBackground(Object ...)

我试图在我的本地数据库中发送和验证我的登录凭据,因此我使用了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)

java android json android-asynctask

0
推荐指数
1
解决办法
1700
查看次数

Android:AsyncTask没有达到onPostExecute

我在我的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)

android countdownlatch android-asynctask

0
推荐指数
1
解决办法
348
查看次数

如何有效地列出包括子目录在内的目录中的所有文件?

我正在开发一个画廊应用程序,该应用程序显示手机或笔式驱动器中的所有图像。我成功地列出了所有图像并将其显示在应用程序中。但我认为它很慢。我使用的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)

file-io android gallery image-gallery android-asynctask

0
推荐指数
1
解决办法
1763
查看次数

Android:从不正确的线程访问领域。Realm 对象只能在创建它们的线程上访问

因此,在 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)

android realm android-asynctask android-thread

0
推荐指数
1
解决办法
7288
查看次数

doInBackground完成后启用按钮

一旦doInBackground()完成后我想从我的主要活动中启用几个按钮!有人可以让我知道怎么做吗?

因为它不是一个班级,所以我不能用它findViewByID()来让AsyncTask班级上的按钮可见activity!:/

java android android-asynctask

-1
推荐指数
1
解决办法
563
查看次数