1

Androidで非同期タスクを実行したいのですが、アクティビティ内ではなく別のクラスで作成しました。私の問題は、ProgressBar の可視性を INVISIBLE から GONE に設定すると、NullPointerException が返されることです。理由がわかりません。これはこれまでの私のコードです。

package com.ursabyte.boxi;

import android.os.AsyncTask;
import android.widget.ProgressBar;

public class SyncPercobaan extends AsyncTask<Object, Boolean, String> {

    AktifitasUtama ut;
    ManajemenFile mf;
    ProgressBar loading;


    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        ProgressBar loading = (ProgressBar) ut.findViewById(R.id.loading);
        loading.setVisibility(ProgressBar.VISIBLE);
    }

    @Override
    protected void onPostExecute(String response) {
        super.onPostExecute(response);
        ProgressBar loading = (ProgressBar) ut.findViewById(R.id.loading);
        loading.setVisibility(ProgressBar.GONE);
        ut.browseToRoot();
    }

    @Override
    protected String doInBackground(Object... params) {
        String dir_name = (String) params[0];
        ut = (AktifitasUtama) params[1];
        ManajemenFile mf = new ManajemenFile(ut);
        mf.retrieve_user_dir();
        return dir_name;
    }
}

AktifitasUtama は私のメイン アクティビティです。

4

2 に答える 2

0

ここ

public class SyncPercobaan extends AsyncTask<Object, Boolean, String> {

    AktifitasUtama ut;  //<<--here

あなたの場合のように、ActivityからActivityクラスにUi要素にアクセスするのは正しい方法ではありませんAsyncTask

非 Activity クラスから UI 要素にアクセスするには、非 Activity のコンストラクターを次のように作成します。

public class SyncPercobaan extends AsyncTask<Object, Boolean, String> {
Context context;
    SyncPercobaan(Context context){
      this.context=context;
    }
  //your code here

contextからすべての UI 要素にアクセスするために使用するようになりましたAktifitasUtama

于 2012-12-21T04:05:37.230 に答える
0

答えは context.runOnUiThread です。私の場合、ut.runOnUiThread. そして、ここにコードがあります:

public class SyncPercobaan extends AsyncTask<Object, Boolean, String> {

    AktifitasUtama ut;
    ManajemenFile mf;
    ManajemenKoneksi mk;
    SessionManager session;
    DatabaseHandler dh;


    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected void onPostExecute(String response) {
        final String res = response; 
        super.onPostExecute(response);
        session = new SessionManager(ut);
        ut.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                ut.toogle_indicator(false);
                ut.display_toast(res);
            }
        });
        ut.browseToRoot();
    }

    @Override
    protected String doInBackground(Object... params) {
        String dir_name = (String) params[0];
        ut = (AktifitasUtama) params[1];
        session = new SessionManager(ut);
        mk = new ManajemenKoneksi(ut);
        if(mk.is_connected()){
            ut.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    ut.display_toast("Starting syncing...");
                    ut.toogle_indicator(true);
                }
            });     
            ManajemenFile mf = new ManajemenFile(ut);
            String result = mf.retrieve_user_dir(dir_name);
            if(result.equals("true")){
                return "Syncing completed...";
            } else {
                return result;
            }
        } else {
            return "Internet connection unavailable";
        }
    }

}

class Task extends TimerTask {
    AktifitasUtama au;
    String dir_name;
    Task(AktifitasUtama ut, String dir_name){
        au=ut;
        this.dir_name=dir_name;
    }

    public void run() {
        ManajemenFile mf = new ManajemenFile(au);
        mf.retrieve_user_dir(dir_name);
    }
}
于 2013-01-10T05:02:00.107 に答える