use*_*007 11 android solution handler android-asynctask
我知道第一个你要这就是......为什么你会在世界上使用AsyncTask.
所以这是我的问题我正在研究一些Android应用程序(API为Android 2.1或更高版本),我正在测试模拟器,一切都很好,所以然后我测试HTC Sensation,它说NetworkOnMainThreadExeption!
我正在下载一些图片,然后在地图上绘制.
所以为了解决这个问题,每个(互联网连接)在这种情况下下载图片我必须把AsyncTask放到工作.
所以我需要一种方法如何知道所有图片何时完成所以我可以开始绘图..
我试了这么多,没有结果我不知道.我有一个处理程序的解决方案,但如果在较慢的网络上运行我得到nullpointer(因为图片没有下载).
所以请帮助我.
编辑:
这是一个想法:
Bitmap bubbleIcon ;
    onCreate(){
     ...
// i am making call for Async
new ImgDown().execute(url);
//and then i calling functions and classes to draw with that picture bubbleIcon !
DrawOnMap(bubbleIcon);
}
//THIS IS ASYNC AND FOR EX. SUPPOSE I NEED TO DOWNLOAD THE PIC FIRST
     class ImgDown extends AsyncTask<String, Void, Bitmap> {
        private String url;
        public ImgDown() {
        }
        @Override
        protected Bitmap doInBackground(String... params) {
            url = params[0];
            try {
                return getBitmapFromURL(url);
            } catch (Exception err) {
            }
            return null;
        }
        @Override
        protected void onPostExecute(Bitmap result) {
            bubbleIcon = result;
            bubbleIcon = Bitmap
                    .createScaledBitmap(bubbleIcon, 70, 70, true);
        }
        public Bitmap getBitmapFromURL(String src) {
            try {
                Log.e("src", src);
                URL url = new URL(src);
                HttpURLConnection connection = (HttpURLConnection) url
                        .openConnection();
                connection.setDoInput(true);
                connection.connect();
                InputStream input = connection.getInputStream();
                // /tuka decode na slika vo pomalecuk kvalitet!
                BitmapFactory.Options options = new BitmapFactory.Options();
                options.inSampleSize = 3;
                Bitmap myBitmap = BitmapFactory
                        .decodeStream(new FlushedInputStream(input));
                Log.e("Bitmap", "returned");
                return myBitmap;
            } catch (IOException e) {
                e.printStackTrace();
                Log.e("getBitmapFromURL", e.getMessage());
                return null;
            }
        }
        class FlushedInputStream extends FilterInputStream {
            public FlushedInputStream(InputStream inputStream) {
                super(inputStream);
            }
            public long skip(long n) throws IOException {
                long totalBytesSkipped = 0L;
                while (totalBytesSkipped < n) {
                    long bytesSkipped = in.skip(n - totalBytesSkipped);
                    if (bytesSkipped == 0L) {
                        int byteValue = read();
                        if (byteValue < 0) {
                            break; // we reached EOF
                        } else {
                            bytesSkipped = 1; // we read one byte
                        }
                    }
                    totalBytesSkipped += bytesSkipped;
                }
                return totalBytesSkipped;
            }
        }
    }
我希望现在更清楚了.
小智 32
class OpenWorkTask extends AsyncTask {
    @Override
    protected Boolean doInBackground(String... params) {
        // do something
        return true;
    }
    @Override
    protected void onPostExecute(Boolean result) {
        // The results of the above method
        // Processing the results here
        myHandler.sendEmptyMessage(0);
    }
}
Handler myHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        switch (msg.what) {
        case 0:
            // calling to this function from other pleaces
            // The notice call method of doing things
            break;
        default:
            break;
        }
    }
};
您可以使用OOP原则编写自己的委托来委派有关完成任务的信息:
task_delegate.java
public interface TaskDelegate {
    void TaskCompletionResult(String result);
}
main_activity.java
public class MainActivity extends Activity implements TaskDelegate {
    //call this method when you need     
    private void startAsynctask() {
      myAsyncTask = new MyAsyncTask(this);
      myAsyncTask.execute();
     }
//your code
    @Override
    public void TaskCompletionResult(String result) {
        GetSomethingByResult(result);
    }
}
my_asynctask.java
public class MyAsyncTask extends AsyncTask<Void, Integer, String> {
    private TaskDelegate delegate;
    protected MyAsyncTask(TaskDelegate delegate) {
        this.delegate = delegate;
    }
    //your code 
    @Override
    protected void onPostExecute(String result) {
        delegate.TaskCompletionResult(result);
    }
}
| 归档时间: | 
 | 
| 查看次数: | 50167 次 | 
| 最近记录: |