Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/217.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用BroadcastReceiver更新进度条_Java_Android_Android Service_Android Progressbar - Fatal编程技术网

Java 使用BroadcastReceiver更新进度条

Java 使用BroadcastReceiver更新进度条,java,android,android-service,android-progressbar,Java,Android,Android Service,Android Progressbar,我正在尝试从服务任务更新进度条。我实现了一个BroadcastReceiver,以便可以与UI线程交互。我更新主活动中的ProgressBar,并从MyService活动接收数据。MyService活动执行异步任务并更新应在OnProgressUpdate方法中发回的意图 这是我的密码: main活动: package com.example.services; import android.content.BroadcastReceiver; import android.content.C

我正在尝试从
服务
任务更新
进度条
。我实现了一个
BroadcastReceiver
,以便可以与UI线程交互。我更新主活动中的
ProgressBar
,并从MyService活动接收数据。MyService活动执行异步任务并更新应在OnProgressUpdate方法中发回的意图

这是我的密码:

main活动:

package com.example.services;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.IntentFilter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.content.Intent;
import android.view.View;
import android.widget.ProgressBar;

import static android.content.Intent.ACTION_ATTACH_DATA;

public class MainActivity extends AppCompatActivity {

    private MyBroadRequestReceiver receiver;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        IntentFilter filter = new IntentFilter(ACTION_ATTACH_DATA);
        receiver = new MyBroadRequestReceiver();
        registerReceiver( receiver, filter);
    }

    public void startService(View view) {
        startService(new Intent(getBaseContext(), MyService.class));
        //pb.setProgress();
    }
    public void stopService(View view) {
        stopService(new Intent(getBaseContext(), MyService.class));
    }
    public class MyBroadRequestReceiver extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {
            ProgressBar pb = (ProgressBar) findViewById(R.id.progressbar);
            int progress = intent.getFlags();
            pb.setProgress(progress);

        }

    }
}
package com.example.services;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.widget.ProgressBar;
import android.widget.Toast;
import java.net.MalformedURLException;
import java.net.URL;
import android.os.AsyncTask;
import android.util.Log;
import java.util.Timer;
import java.util.TimerTask;

public class MyService extends Service {

    int counter = 0;
    static final int UPDATE_INTERVAL = 1000;
    private Timer timer = new Timer();

    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show();
        doSomethingRepeatedly();

        try {
            new DoBackgroundTask().execute(
                    new URL("http://www.amazon.com/somefiles.pdf"),
                    new URL("http://www.wrox.com/somefiles.pdf"),
                    new URL("http://www.google.com/somefiles.pdf"),
                    new URL("http://www.learn2develop.net/somefiles.pdf"));
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        return START_STICKY;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        if (timer != null){
            timer.cancel();
        }
        Toast.makeText(this, "Service Destroyed", Toast.LENGTH_LONG).show();
    }

    private void doSomethingRepeatedly() {
        timer.scheduleAtFixedRate(new TimerTask() {
            public void run() {
                Log.d("MyService", String.valueOf(++counter));

            }
        }, 0, UPDATE_INTERVAL);
    }

    private class DoBackgroundTask extends AsyncTask<URL, Integer, Long> {
        protected Long doInBackground(URL... urls) {
            int count = urls.length;
            long totalBytesDownloaded = 0;
            for (int i = 0; i < count; i++) {
                totalBytesDownloaded += DownloadFile(urls[i]);
                //Intent broadcastIntent = new Intent();
                //broadcastIntent.setAction(Intent.ACTION_ATTACH_DATA);
                //sendBroadcast(broadcastIntent);
                publishProgress((int) (((i + 1) / (float) count) * 100));
            }
            return totalBytesDownloaded;
        }

        protected void onProgressUpdate(Integer... progress) {
            Log.d("Downloading files", String.valueOf(progress[0]) + "% downloaded");
            Intent broadcastIntent = new Intent();
            broadcastIntent.setAction("com.example.services.MainActivity");
            //broadcastIntent.putExtra("progress",progress);
            broadcastIntent.setFlags(progress[0]);
            sendBroadcast(broadcastIntent);
            Toast.makeText(getBaseContext(),
                    String.valueOf(progress[0]) + "% downloaded-"+counter,
                    Toast.LENGTH_LONG).show();

        }

        protected void onPostExecute(Long result) {
            Toast.makeText(getBaseContext(), "Downloaded " + result + " bytes",
                    Toast.LENGTH_LONG).show();
            //stopSelf();
        }
    }

    private int DownloadFile(URL url) {
        try {
            //---simulate taking some time to download a file---
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //---return an arbitrary number representing
        // the size of the file downloaded---
        return 100;
    }
}
MyService:

package com.example.services;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.IntentFilter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.content.Intent;
import android.view.View;
import android.widget.ProgressBar;

import static android.content.Intent.ACTION_ATTACH_DATA;

public class MainActivity extends AppCompatActivity {

    private MyBroadRequestReceiver receiver;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        IntentFilter filter = new IntentFilter(ACTION_ATTACH_DATA);
        receiver = new MyBroadRequestReceiver();
        registerReceiver( receiver, filter);
    }

    public void startService(View view) {
        startService(new Intent(getBaseContext(), MyService.class));
        //pb.setProgress();
    }
    public void stopService(View view) {
        stopService(new Intent(getBaseContext(), MyService.class));
    }
    public class MyBroadRequestReceiver extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {
            ProgressBar pb = (ProgressBar) findViewById(R.id.progressbar);
            int progress = intent.getFlags();
            pb.setProgress(progress);

        }

    }
}
package com.example.services;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.widget.ProgressBar;
import android.widget.Toast;
import java.net.MalformedURLException;
import java.net.URL;
import android.os.AsyncTask;
import android.util.Log;
import java.util.Timer;
import java.util.TimerTask;

public class MyService extends Service {

    int counter = 0;
    static final int UPDATE_INTERVAL = 1000;
    private Timer timer = new Timer();

    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show();
        doSomethingRepeatedly();

        try {
            new DoBackgroundTask().execute(
                    new URL("http://www.amazon.com/somefiles.pdf"),
                    new URL("http://www.wrox.com/somefiles.pdf"),
                    new URL("http://www.google.com/somefiles.pdf"),
                    new URL("http://www.learn2develop.net/somefiles.pdf"));
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        return START_STICKY;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        if (timer != null){
            timer.cancel();
        }
        Toast.makeText(this, "Service Destroyed", Toast.LENGTH_LONG).show();
    }

    private void doSomethingRepeatedly() {
        timer.scheduleAtFixedRate(new TimerTask() {
            public void run() {
                Log.d("MyService", String.valueOf(++counter));

            }
        }, 0, UPDATE_INTERVAL);
    }

    private class DoBackgroundTask extends AsyncTask<URL, Integer, Long> {
        protected Long doInBackground(URL... urls) {
            int count = urls.length;
            long totalBytesDownloaded = 0;
            for (int i = 0; i < count; i++) {
                totalBytesDownloaded += DownloadFile(urls[i]);
                //Intent broadcastIntent = new Intent();
                //broadcastIntent.setAction(Intent.ACTION_ATTACH_DATA);
                //sendBroadcast(broadcastIntent);
                publishProgress((int) (((i + 1) / (float) count) * 100));
            }
            return totalBytesDownloaded;
        }

        protected void onProgressUpdate(Integer... progress) {
            Log.d("Downloading files", String.valueOf(progress[0]) + "% downloaded");
            Intent broadcastIntent = new Intent();
            broadcastIntent.setAction("com.example.services.MainActivity");
            //broadcastIntent.putExtra("progress",progress);
            broadcastIntent.setFlags(progress[0]);
            sendBroadcast(broadcastIntent);
            Toast.makeText(getBaseContext(),
                    String.valueOf(progress[0]) + "% downloaded-"+counter,
                    Toast.LENGTH_LONG).show();

        }

        protected void onPostExecute(Long result) {
            Toast.makeText(getBaseContext(), "Downloaded " + result + " bytes",
                    Toast.LENGTH_LONG).show();
            //stopSelf();
        }
    }

    private int DownloadFile(URL url) {
        try {
            //---simulate taking some time to download a file---
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //---return an arbitrary number representing
        // the size of the file downloaded---
        return 100;
    }
}
package com.example.services;
导入android.app.Service;
导入android.content.Intent;
导入android.os.IBinder;
导入android.widget.ProgressBar;
导入android.widget.Toast;
导入java.net.MalformedURLException;
导入java.net.URL;
导入android.os.AsyncTask;
导入android.util.Log;
导入java.util.Timer;
导入java.util.TimerTask;
公共类MyService扩展服务{
int计数器=0;
静态最终整数更新间隔=1000;
专用计时器=新计时器();
@凌驾
公共IBinder onBind(意图arg0){
返回null;
}
@凌驾
公共int onStartCommand(Intent Intent、int标志、int startId){
Toast.makeText(此“服务已启动”,Toast.LENGTH_LONG).show();
dosomethingreepeatedly();
试一试{
新建DoBackgroundTask()。执行(
新网址(“http://www.amazon.com/somefiles.pdf"),
新网址(“http://www.wrox.com/somefiles.pdf"),
新网址(“http://www.google.com/somefiles.pdf"),
新网址(“http://www.learn2develop.net/somefiles.pdf"));
}捕获(格式错误){
e、 printStackTrace();
}
返回开始时间;
}
@凌驾
公共空间{
super.ondestory();
如果(计时器!=null){
timer.cancel();
}
Toast.makeText(此“服务已销毁”,Toast.LENGTH_LONG).show();
}
私人无效Dosomethingreepeatedly(){
timer.scheduleAtFixedRate(新TimerTask(){
公开募捐{
Log.d(“MyService”,String.valueOf(++计数器));
}
},0,更新间隔);
}
私有类DoBackgroundTask扩展了AsyncTask{
受保护的长doInBackground(URL…URL){
int count=url.length;
long totalBytesDownloaded=0;
for(int i=0;i

请查看我的
onProgressUpdate
,并告诉我这样做是否正确。我的ProgressBar根本没有更新。

因为您没有启动OnCreate()方法上的服务。服务将不会运行。

因为您没有启动onCreate()方法上的服务。服务将无法运行。

首先,这并不是解决您所解决问题的好办法。请浏览谷歌Android文档


我建议您切换到DownloadManager。

首先,这并不是解决您所解决问题的好办法。请浏览谷歌Android文档


我建议您切换到DownloadManager。

您的意图过滤器定义为“操作\附加\数据”

因此,请按以下方式发送广播:

Intent i = new Intent(ACTION_ATTACH_DATA);
sendBroadcast(i);

另外,别忘了在onDestroy注销广播

您的意图过滤器正在定义“操作附加数据”

因此,请按以下方式发送广播:

Intent i = new Intent(ACTION_ATTACH_DATA);
sendBroadcast(i);
另外,别忘了在onDestroy注销广播